2009-09-11 55 views
2

我发现我写在控制器中的代码在很大程度上是重复性的,更重要的是我为我的控制器编写的测试也是非常重复的。保存方法的一般模式如下...ASP.NET MVC:我应该将原语传递给我的动作,还是应该使用模型绑定器?

取一个实体和一些基本参数。将基本参数中的值写入实体上的相同命名参数。验证实体。如果实体有效,请保存该实体。

我已经有一个模型联编程序,它将绑定从IDataEntity(我们所有数据库持久化实体实现的接口)继承的任何东西。该模型联编程序找到适当的存储库并使用传入的id查找实体。

我一直在考虑在这个模型联编程序中添加一个扩展,它也会从值提供程序中提取值并将它们写入现有值。这会为我在为我的实体分配值时的操作节省一些重复代码。并且还允许我只将实体传递给我的控制器测试,而不是大量的值。

例如,目前看起来像这样的方法:

public ActionResult SaveCompanyAddress(Address address, 
     string address1, 
     string address2, 
     string address3, 
     string city, 
     string county, 
     Country country, 
     string postcode) 
    { 
     address.Address1 = address1; 
     address.Address2 = address2; 
     address.Address3 = address3; 
     address.City = city; 
     address.County = county; 
     address.Country = country; 
     address.Postcode = postcode; 

     Validate(address); 

     if (ModelState.IsValid) 
     { 
      using (var tran = TransactionFactory.CreateTransaction()) 
      { 
       addressRepository.Save(entity); 
       tran.Commit(); 
      } 

      return this.RedirectToAction(x => x.List(address.Company)); 
     } 
     else 
     { 
      return View("Edit", address); 
     } 
    } 

会在长度减半,并已几乎所有它的参数删除。这听起来很吸引人,因为我们编写的代码量减少了,测试验证的测试可以通过模拟验证提供程序和默认地址,而不用担心设置所有这些参数。但我担心可能会有一些幕后魔法让它成为一个好主意。

想法? Opnions?想法?

回答

2

您可能还会妥协并使用默认模型联编程序绑定您的简单属性,并从值提供程序获取复杂属性并将其填入“手动”。对于只有简单属性的模型,默认模型绑定器就足够了。对于那些具有一个或两个复杂属性(那些不由默认模型联编程序处理的属性),仍然可以保存大量代码而无需编写自定义模型联编程序。复杂的绑定代码可以使用类中的共享方法编写。一旦控制器中的绑定代码需要跨越控制器边界或变得显着,请将其重构为您的自定义模型绑定器。

+0

需要自定义模型联编程序的原因是我必须先在数据库中查找实体。然后使用默认模型绑定器样式绑定将值设置到其属性上。这使我的保存可以轻松更新我现有的实体。我相信可以将绑定到默认模型联编程序的属性交给他人。 – 2009-09-11 10:55:53

+1

您仍然可以使用TryUpdateModel/UpdateModel获取简单属性,并在更新现有模型时使用ValueProvider中的值手动更新复杂属性。也就是说,您的方法是将模型的主键作为参数,使用键检索模型,使用Try/UpdateModel更新简单属性并手动处理复杂属性。最终,你可能会发现你确实需要一个自定义模型绑定器(或者已经写了大部分),然后可以重构它。 – tvanfosson 2009-09-11 13:15:39

相关问题