Domain driven design 领域驱动设计

Domain driven design 领域驱动设计,domain-driven-design,Domain Driven Design,DDD的分层方案建议分层应: 演示/应用程序/域/基础架构 Evans书中的图表显示了访问基础架构层的演示。我对这个图表的解释是否正确,因为上面的任何一层都可以访问下面的任何一层???这个问题是用“层”这个词提出的,所以我最初的回答是针对层的。最好一开始就说DDD与刚性层无关,而是以一种易于测试和更改的方式构建应用程序,因为它鼓励在不同对象之间分离关注点 我不喜欢将域称为“层”,因为域对象并不真正形成通常意义上的层,它们在层之间传递,但不属于任何层。至于让表示层访问基础设施,图表表明这是一个选项

DDD的分层方案建议分层应:

演示/应用程序/域/基础架构


Evans书中的图表显示了访问基础架构层的演示。我对这个图表的解释是否正确,因为上面的任何一层都可以访问下面的任何一层???

这个问题是用“层”这个词提出的,所以我最初的回答是针对层的。最好一开始就说DDD与刚性层无关,而是以一种易于测试和更改的方式构建应用程序,因为它鼓励在不同对象之间分离关注点

我不喜欢将域称为“层”,因为域对象并不真正形成通常意义上的层,它们在层之间传递,但不属于任何层。至于让表示层访问基础设施,图表表明这是一个选项。如何从演示文稿中抽象出对基础结构的访问权取决于您。在大多数情况下,我倾向于浏览应用程序层,以避免将其与实现细节捆绑在一起,但直接方法是一种选择,决定权在您


我觉得读埃文斯的书有点让人沮丧,因为他没有具体的例子,但他正试图让它更广泛地适用,而且有些语言比其他语言灵活得多,所以他们可以做不同的事情。例如,当使用Java和Hibernate时,我没有从域到数据访问对象的任何引用,我认为Hibernate持久集合实现就像存储库一样,允许对域模型进行惰性遍历。但这是一个基于我对语言和库的选择的实现决策,其他情况可能会证明不同的决策是正确的。

嗯,IMHO DDD并不是关于“分层”。 它更多地是关于以一种好的方式对您试图解决的问题进行建模,以便您的模型(实体、值对象、存储库、服务、规范)反映真实世界的问题域

然而,在您编写的类之间确实存在某种“分离”,但我真的不想称之为“分层”,因为您的表示类和域类访问基础设施是完全可以的。 然而,域类不应该依赖于表示类,但事实恰恰相反

我主要以这种方式组织我的项目:

  • a有一个包含演示文稿相关内容的程序集。(表格等)
  • 我有一个包含“域”的程序集。这包括实体、存储库- 接口、规范类等
  • 另一个包含存储库实现的程序集
  • 一组基础结构程序集:
    • 一个通用的“框架”dll,其中包含我可以在演示文稿、域类等中使用的UTIL
    • 一个包含DB访问帮助程序的dll(在我的例子中,是NHibernate的一个薄包装)
与Nathan Hughes所说的相反,我认为您的表示层能够访问基础设施是完全可以的,因为我有时会省略“应用程序服务层”。在这种情况下,我的表示层就是我的应用程序。 我也使用NHibernate,对我来说,我的表示层访问NHibernate助手是可以的。因为,我的应用程序(在某些情况下是我的表示层)是唯一了解应用程序上下文的“东西”。例如,这就是负责启动和提交事务的人


(正如埃文斯所说——在第五章中,我认为:环境就是王者)。

这是我的想法,我不认为域对象是其他层引用的域对象/服务库的一个层,也不认为域对象是其他层引用的一个层,我当然不希望看到使用数据访问层等的演示。p68上的Evans图似乎表明了一种非常松散的方法,可以访问其他层。它看起来确实像Evans希望鼓励设计者尽可能地具有灵活性。我认为将域层视为一个单独的层的逻辑是,它鼓励您将域逻辑放在其中,而不是放在表示层或应用层中,反之亦然。我以前在您提到的声明中提到过域逻辑,但后来放弃了它,我同意不应该强加教条式的分层方案。我们是说,对于DDD,重点是领域接受其他问题,例如基础设施等,并且没有严格的分层。如果需要的话,任何上层都可以在不经过任何中介的情况下使用任何下层。我认为DDD的重点是关注点的分离,域逻辑位于域对象中,并且在了解业务真正需要的情况下尽可能轻松地对系统进行更改。您可以在有用的范围内使用分层方案,但没有严格的要求。