C# 我应该在哪里将实体转换为DTO';s

C# 我应该在哪里将实体转换为DTO';s,c#,domain-driven-design,C#,Domain Driven Design,我的架构如下所示: 领域 实体 接口 DTOs 基础设施 奥姆 存储库 服务 网络服务 我想用AutoMapper转换它。我希望我的服务层只知道DTO,所以我猜我会让我的接口和存储库返回转换后的DTO。至于另一个方向,我假设我的存储库将采用DTO并转换为实体?我是在这里的正确路径上还是在左边的字段中?您的服务层应该返回实体,而您的表示层(控制器所在的imho)应该将实体转换为映射到您的用户界面(DTO)的对象。当然,这也意味着您的存储库将返回普通实体 不要忘记只创建一次映射。创建

我的架构如下所示:

  • 领域
    • 实体
    • 接口
    • DTOs
  • 基础设施
    • 奥姆
    • 存储库
  • 服务
    • 网络服务

我想用AutoMapper转换它。我希望我的服务层只知道DTO,所以我猜我会让我的接口和存储库返回转换后的DTO。至于另一个方向,我假设我的存储库将采用DTO并转换为实体?我是在这里的正确路径上还是在左边的字段中?

您的服务层应该返回实体,而您的表示层(控制器所在的imho)应该将实体转换为映射到您的用户界面(DTO)的对象。当然,这也意味着您的存储库将返回普通实体

不要忘记只创建一次映射。创建一个引导程序或创建所有映射的东西,然后只需在控制器中调用Mapper.Map()

  • 您的存储库应该只处理域聚合,它是围绕行为和事务设计的

  • 处理命令时,应用程序层(web服务)应调用域模型上的逻辑,将聚合保存回存储库

  • 当客户端需要来自web服务的数据时,您有两个选项:

    • 从存储库获取聚合并将其映射到POCO DTO(可能使用AutoMapper)
    • 创建一个精简数据访问层,专门用于直接向DTO查询数据
  • 我倾向于后一种方法。正如我所说,域聚合应该由行为和事务设计。它们不是为在屏幕上显示数据而设计的。试图将数据从正确设计的域实体(即正确封装的)映射到数据使用者(如UI)的DTO,总是一个笨拙的过程。这是圆孔里的方钉。在我看来,提供一个瘦数据访问层来返回客户端所需的任何数据要容易得多。域模型不需要参与这个过程;这只是数据。这是我们的基本原则


    在任何情况下,都应该是应用层(web服务)将域实体转换为DTO。

    Yep。您应该使用您的实体(我想是代表您的模型的实体),直到您的最后一个受控层。但这是我的问题,我的实体使用Iesi.Collections.ISet,它不能为我的服务层WCF服务序列化。我明白你的意思,但对于我的WCF服务层,这会改变事情吗?我不同意,除非他的体系结构保证实体遵循域模型而不是数据模型。我尝试遵循域优先的方法。如果你先做域,那么你不需要DTO,您需要视图模型,这些模型应该映射到您的接口层,在您的情况下,接口层是服务层,因此我同意Leon的观点。谁将使用您的服务以及如何使用?我的服务将像API一样被访问到我的内部系统中。有些是内部的,但在将来,外部系统将连接。如果它在未来或内部,服务很容易连接和入侵,您的公开端点(web服务)应该返回安全DTO,它不会包含整个实体。因此,正确的解决方案可能是映射到我的服务层的DTO,但在我的存储库中,映射到ViewModelsYes,服务总是返回DTO,因为我们只会根据身份验证和用户访问发送信息。然而,我们使用动态序列化来避免DTO的生成,这很痛苦。动态序列化只根据登录的用户序列化实体的一部分,这样的规则在数据库本身和代码外进行编码。这似乎是对我来说最好的方法。谢谢