【问题标题】:Get an Entity in Save Method, What is correct form?在保存方法中获取实体,正确的形式是什么?
【发布时间】:2010-05-25 01:47:40
【问题描述】:

我是asp.net mvc的初学者,我有一些疑问。

P.S:我是用 DDD 来学习的

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

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

或者我需要获得一个 DTO(具有类似于我的实体的结构)并创建一个将属性逐个属性传递给实体的对象吗? 我不喜欢 FormCollection,我想知道,在架构上推荐什么?

非常感谢大家

干杯

【问题讨论】:

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


    【解决方案1】:

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

    现场演示可以看我的项目——DDDSample.NET

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        [HttpGet]
        public ActionResult Create() {
            return View("Create", new Product());
        }
        
        [HttpPost]
        public ActionResult Create(Product product) { //or Save(Product)
            ...
        }
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多