在保存方法中获取实体,什么是正确的形式?

时间:2010-04-26 19:29:38

标签: asp.net-mvc architecture domain-driven-design

我在asp.net mvc中打招呼,我有些疑惑。

P.S:我正在使用DDD来学习

我在Controller中有一个ACtion,它将通过存储库(对于数据库)保存一个实体(来自我的模型)。 我的疑问是,如何从View中获取信息并通过Controller中的存储库保存? 在控制器的Save方法中获取我的Model实体是否正确,如下所示:

public ActionResult Save(产品产品) {   //验证对象
  //将数据保存在存储库中   return View(“成功”); }

或者我需要一个DTO(具有与我的实体类似的结构)并创建一个对象,通过属性将属性传递给实体? 我不喜欢FormCollection,我想知道,建议的是什么?

非常感谢你们

干杯

4 个答案:

答案 0 :(得分:1)

通常,在ASP.NET MVC中,控制器操作将在编辑实体类型时接收DefaultModelBinder返回的强类型对象。使用此模式,您可以将“Product”自身或作为DTO的一部分传递到GET视图,然后“Save”方法将在其参数列表中接收“Product”对象。

只要您使用编辑器模板或具有匹配名称的字段(即Html.TextBox("Name")对应于Product.Name),则DefaultModelBinder应该能够正确填充传递给action方法的类型化实体对象。除了在某些边缘情况下,你不应该乱用FormCollection。

[HttpGet]
public ActionResult Create() {
    return View("Create", new Product());
}

[HttpPost]
public ActionResult Create(Product product) { //or Save(Product)
    ...
}

答案 1 :(得分:1)

可以通过添加所谓的view model来解决此类问题。

基本上 - 视图模型是为特定视图提供数据的DTO。以类似的方式 - 视图模型用于通过模型绑定从视图中获取数据。然后 - 控制器只需将必要的数据转发到域模型。

答案 2 :(得分:1)

我想遵循蓝皮书所描述的DDD实践,您应该将您的视图绑定到DTO,这可以转发到一个瘦的“应用程序”层,在该层中创建或从数据库中检索Domain对象。此应用程序层可以是带有方法的简单外观,也可以利用命令模式。

对于现场演示,您可以看到我的项目 - DDDSample.NET

答案 3 :(得分:0)

只要表单的字段与Product中的字段匹配,就应根据值自动填充它们。保存实体的方式取决于数据模型,无论是创建新记录还是编辑现有记录等。