C#-DDD:DTO属于哪一层?

时间:2017-05-09 05:50:50

标签: c# domain-driven-design

我是DDD概念的新成员,我正在努力设计一个严格遵循DDD& amp;的解决方案结构。棱镜(WPF)。 我正在堆叠在哪里创建DTO项目(数据传输对象)。据我所知,DDD将有4个通用层:

演示文稿

申请

域名

基础设施

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

我已提到:DDD - which layer DTO should be implemented 有人告诉我们应该在服务层实现它,但我认为这没有意义,因为遵循DDD概念,我们没有哪个叫做服务层。

非常感谢你,

此致

3 个答案:

答案 0 :(得分:3)

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

那么,在您的情况下,谁是DTO的所有者?谁控制了DTO的结构和目的?

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

答案 1 :(得分:3)

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

域驱动设计与图层无关。它涉及 设计

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

设计 是您对解决方案进行建模的方式。它从您通过与领域专家交谈获得的知识开始。它继续决定您的有界上下文以及它们如何放置在上下文映射中。然后,您决定如何实现每个上下文 - 这将是域模型,活动记录,CRUD或一些现成的软件。

当您决定实施时,您可以想到内部结构,而DDD并没有在那里指示任何内容。

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

关于在您的问题中使用DDD一词,我前段时间写了a blog post,针对此问题,您可能需要阅读。

答案 2 :(得分:0)

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

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

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

你可以看到我的项目示例,里面的“Core layer”是指“Domain Layer” DDD model example

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