【问题标题】:C#-DDD: Which layer DTO belong into?C#-DDD:DTO属于哪一层?
【发布时间】:2017-10-07 07:20:42
【问题描述】:

我是 DDD 概念的新手,我正在尝试设计一个严格遵循 DDD 和 Prism (WPF) 的解决方案结构。 我在哪里创建 DTO 项目(数据传输对象)。据我所知,DDD 将有 4 个通用层:

演示文稿

应用

领域

基础设施

那么,请您告诉我DTO项目属于哪个层?


我参考过:DDD - which layer DTO should be implemented 有人说我们应该在Service层实现它,但我认为这没有意义,因为遵循DDD概念,我们没有哪个称为Service层。

非常感谢,

问候

【问题讨论】:

  • DTO 用于 DataTransferObject,大多数时候用于在层之间传输数据。有一些组件将用作层之间的桥梁
  • @SirRufo 谢谢,我明白了。但是我不知道应该使用哪个层来创建 DTO 项目?
  • @KhoaDANGTOAN 你有数据和某种服务来处理这些数据。用 DTO 类和数据服务作为接口描述数据结构。
  • @ConstantinGALBENU “很多 DTO 在层之间飞来飞去只是为了遵循严格的架构版本”我只是想弄清楚为什么其他架构的 DTO 会更少。我的意思是,系统边界最有可能需要 DTO,而与所选架构无关?

标签: c# domain-driven-design


【解决方案1】:

我看到我们应该在层中添加 DTO 类将创建它们的对象以将它们发送到另一个层。 在 DDD 模型中,Application 层和 Infrastructure 层已经可以访问 Domain 层,因此它们不需要在 Infrastructure 层中使用 DTO,因为它会返回实体类。

基于上述,我们需要 DTO 来表示从应用层中的数据库(通过基础设施层)检索到的数据,并使用 DTO 将这些数据发送到表示层,而不需要表示层访问包含在领域模型层。

最后,根据我的经验和使用 DDD 模型,我更喜欢在应用层内的单独项目中添加 DTO。这意味着它属于应用层。

您可以看到我的项目示例,其中的“核心层”表示“域层”

你也可以阅读Excellent detailed explanation for DDD model from Microsoft

【讨论】:

    【解决方案2】:

    你可能对我的回答感到不安,但我必须再重复一遍:

    领域驱动设计与层无关。这是关于领域设计

    是您的问题空间。这就是您的用户所需要的。这是您的领域专家告诉您的。

    设计是您为解决方案建模的方式。它从您通过与领域专家交谈获得的知识开始。它继续决定您的有界上下文是什么以及它们如何放置在上下文映射中。然后您决定如何实现每个上下文 - 是域模型、Active Record、CRUD 还是一些现成的软件。

    当您决定实施时,您可以考虑内部结构,而 DDD 并没有规定任何内容。

    如果您的问题是在哪里放置数据的 DTO - 好吧,如果多个其他项目使用它们,它们可能位于单独的项目中,或者您将它们放在 DAL(这是典型的),因为您的表示层很可能会直接使用它,而不涉及域模型,否则你根本不会提到 DTO。

    关于你的问题使用术语 DDD,我前段时间写了a blog post,针对这个问题,你可能想阅读。

    【讨论】:

      【解决方案3】:

      一般来说,组件代码的位置应该在该组件的所有者之外。所有者可以完全控制其组件。这个想法遵循dependency inversion principle

      那么,就您而言,谁是 DTO 的所有者?谁控制该 DTO 的结构和目的?

      但是,使用 DDD(在任何架构中!)您应该考虑到域代码不应依赖于基础架构、应用程序或 UI 代码。因此,如果您决定将 DTO 类放入应用程序层,那么您不能从域代码中引用该 DTO(即域实体或域服务不能有任何对 DTO 类的引用 - 没有 import 或 @987654323 @指令或new语句)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 2010-09-15
        • 2016-02-27
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多