基础设施层中的领域驱动设计存储库实现

12

我收到了一个关于DDD分层架构中依赖性的问题。如果Repository的实现在基础设施层中,那么这意味着基础设施层依赖于领域层,因为在Repository实现中将引用实体。

另一方面,如果在领域中使用基础设施服务,领域层可以引用基础设施层。

这样不会创建循环引用吗?


在http://code.google.com/p/ndddsample上有一个DDD的示例实现..也许这会有所帮助.. - Max
2个回答

17

看看洋葱架构,它展示了一个好的DDD解决方案设置。(查看下面的评论 - 如果可以,请改用垂直切片 - 在使用几年后,洋葱的成本似乎不合理)

基本上,所有领域模型和领域服务接口都被视为核心。层只依赖于更接近核心的上层。它们的实际实现由基础设施处理。

领域项目不应引用基础结构项目。如果领域需要使用某些东西,则应在领域内定义为接口,并在基础结构项目中实现。

最终你的接口定义了你的应用程序。如何实现它的逻辑是外部化的。因此,我期望你有包含领域模型和领域服务的程序集,一个前端(例如MVC等),然后是一个基础架构程序集,该程序集实现提供数据等的NHibernate等内容。

您可以在链接文章的各个部分中看到实现体系结构的各种示例。最简单的一个示例在这里

您可以在这里看到与它相关的问题。

主要的好处是大多数情况下都会更改基础设施问题。新的数据层技术,新的文件存储等。此外,您的核心领域应该是相当稳定的,因为它没有实现任何东西,只是通过契约(接口)定义了它所需要的东西。将实现关注点放在一个位置上,您可以将跨程序集所需的变更量最小化。


还要考虑只最小化您的项目并采用垂直切片架构。https://medium.com/@jacobcunningham/out-with-the-onion-in-with-vertical-slices-c3edfdafe118。以这种方式完成了相当多的工作 - 除非您真正需要像洋葱这样的东西,否则不要使用它。 - GraemeMiller

1

是的,在你的情况下是这样的。我也有同样的问题 :)

以下是我的解释:

在Eric Evans的架构图中,基础设施层似乎是一个特殊的层。它实现了接口、应用和领域。

enter image description here

这个说法有些牵强......但另一方面,你可以将基础设施拆分为单独的适配器模块,因为基础设施组件通常由适配器、转换器和门面组成。
例如,
1)如果将MailManager注入到DomainService中,则Domain可能对邮件有依赖。 2)Persistence对Domain有依赖(Repository情况)。
但是,如果将邮件和持久化分开成两个模块,则它们彼此之间没有依赖关系。我认为这可能会缓解问题。
毕竟,分层是一种解耦组件的方法,而不是目的。
最后但并非最不重要的,我期望更有说服力的答案 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接