我应该在哪里将我的实体转换为DTO?

时间:2012-07-09 19:07:10

标签: c# domain-driven-design

我的架构看起来像这样:

    • 实体
    • 接口
    • DTO的
  • 基础设施
    • ORM
    • 存储库
  • 服务
    • 网络服务

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

2 个答案:

答案 0 :(得分:3)

  1. 您的存储库只应处理围绕行为和事务设计的域聚合。
  2. 处理命令时,您的应用程序层(Web服务)应调用域模型上的逻辑,将聚合保存回存储库。
  3. 当客户端需要来自Web服务的数据时,您有两个选择:

    • 从存储库中获取聚合并将它们映射到POCO DTO(可能使用AutoMapper)。
    • 创建一个瘦数据访问层,专门用于直接向DTO查询数据。
  4. 后一种方法是我的偏好。正如我所说,域名聚合按行为和行为设计交易。它们不是为在屏幕上显示数据而设计的。尝试将数据从正确设计的域实体(即,正确封装)映射到DTO以供数据的消费者(例如UI),这总是一个尴尬的过程。它是圆孔中的方形钉。在我看来,提供一个返回客户端所需数据的瘦数据访问层要容易得多。域模型不需要参与此过程;这只是数据。这是CQRS的基本原则。

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

答案 1 :(得分:1)

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

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