Asp.net mvc 基于DDD的应用程序设计

Asp.net mvc 基于DDD的应用程序设计,asp.net-mvc,entity-framework,domain-driven-design,Asp.net Mvc,Entity Framework,Domain Driven Design,我正在为一个应用程序设计解决方案结构。我计划使用领域驱动设计。net MVC和实体框架。在某些方面需要你的投入 首先使用实体框架代码设计数据访问 Repositories建立在EF数据访问之上 域模型是使用存储库顶部的域模型设计的 应用程序服务构建在Damain层的顶部 UI是在应用程序服务之上开发的 流程是 UI(控制器)-->应用程序服务-->域层-->存储库-->数据访问-->数据库 我不太清楚如何在层之间共享数据 我的域模型可用于存储库、数据访问和域层之间的数据共享。我只是在想,数据应该

我正在为一个应用程序设计解决方案结构。我计划使用领域驱动设计。net MVC和实体框架。在某些方面需要你的投入

首先使用实体框架代码设计数据访问 Repositories建立在EF数据访问之上 域模型是使用存储库顶部的域模型设计的 应用程序服务构建在Damain层的顶部 UI是在应用程序服务之上开发的

流程是

UI(控制器)-->应用程序服务-->域层-->存储库-->数据访问-->数据库

我不太清楚如何在层之间共享数据


我的域模型可用于存储库、数据访问和域层之间的数据共享。我只是在想,数据应该如何从Daomin Layert传递到应用程序服务,应用程序服务传递到UI。我可以使用DTO,但不确定这是否是一个好的选择,因为我有一些模型已经在域模型中,在UI中查看模型。

重用域模型或UI模型不好,这将使您的层紧密耦合。以这种方式开发大规模应用程序是非常困难的

您认为正确的是,应用程序是一个很薄的层,它只是一组直接从UI层调用的操作,信息将通过一个名为ActionParameter的对象传递。ActionParameters在应用层定义,ActionParameter对象在UI层构造并传递给应用层

应用程序将通过数据访问层从数据库检索数据。查询操作有时需要从多个源、不同的域实体获取数据,并且在返回到UI层之前需要对数据进行投影、转换或格式化。我们将有一些类似于ActionResult的对象,其中包含要返回到UI层的所有数据


似乎会有很多代码,但我认为这是必要的。每个层都有自己的用途,当我们更改其中一层时,其他层不会受到影响。

根据您描述的流程,在UI层中创建视图模型,由控制器实例化。视图模型是视图绑定到的简单对象。这应该与底层域模型分离,以解决namkha87所指出的问题

至于数据访问层,您可以使用域对象本身进行对象关系映射,因为EF允许这样做。这里不需要中间DTO


另一个要考虑的是将用于查询的模型与用于调用行为的模型分开。通过这种方式,您可以确保应用程序服务不会仅公开行为域对象。让应用程序服务向外层公开域对象的问题在于,它将允许那些外层调用这些对象上的行为,而结果是未定义的。当您只返回只读对象而没有行为时,这不是问题。对于返回的数据,不要让UI层直接创建域对象-。

你的建议是使用DTO?是的,看起来是这样……他说的是使用DTO。我的问题是,如何将数据从应用程序服务传递到UI?为查询创建读取模型,然后将其绑定到UI层中的ViewModels。对于命令,让UI层调用应用程序服务,传递所需的数据,但不使用域对象来携带数据。总的来说,使用这种方法,没有域对象暴露在应用程序服务之外。所以对于写操作,将DTO从UI传递给应用程序服务,而不让UI直接实例化域对象。