2

我的架构如下所示:

  • 领域
    • 实体
    • 接口
    • DTO
  • 基础设施
    • 甲骨文
    • 存储库
  • 服务
    • 网页服务

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

4

2 回答 2

4
  1. 您的存储库应该只处理围绕行为和事务设计的域聚合。

  2. 处理命令时,您的应用程序层(Web 服务)应该调用域模型上的逻辑,将聚合保存回存储库。

  3. 当客户端需要来自 Web 服务的数据时,您有两种选择:

    • 从存储库中获取聚合并将它们映射到 POCO DTO(可能使用 AutoMapper)。
    • 创建一个精简的数据访问层,专门用于直接向 DTO 查询数据。

后一种方法是我的偏好。正如我所说,域聚合应该由行为和事务来设计。它们不是为在屏幕上显示数据而设计的。尝试将数据从正确设计的域实体(即正确封装)映射到数据消费者(例如 UI)的 DTO 始终是一个尴尬的过程。它是圆孔中的方形钉。在我看来,提供一个简单的数据访问层来返回客户端所需的任何数据要容易得多。域模型不需要参与这个过程;这只是数据。这是CQRS的基本原理。

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

于 2012-07-10T08:31:28.240 回答
1

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

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

于 2012-07-09T19:08:53.540 回答