我发现我写在控制器中的代码在很大程度上是重复性的,更重要的是我为我的控制器编写的测试也是非常重复的。保存方法的一般模式如下...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?想法?
需要自定义模型联编程序的原因是我必须先在数据库中查找实体。然后使用默认模型绑定器样式绑定将值设置到其属性上。这使我的保存可以轻松更新我现有的实体。我相信可以将绑定到默认模型联编程序的属性交给他人。 – 2009-09-11 10:55:53
您仍然可以使用TryUpdateModel/UpdateModel获取简单属性,并在更新现有模型时使用ValueProvider中的值手动更新复杂属性。也就是说,您的方法是将模型的主键作为参数,使用键检索模型,使用Try/UpdateModel更新简单属性并手动处理复杂属性。最终,你可能会发现你确实需要一个自定义模型绑定器(或者已经写了大部分),然后可以重构它。 – tvanfosson 2009-09-11 13:15:39