我对DDD分层架构的依赖关系提出了疑问。如果Repository实现位于基础结构层中,则意味着基础结构层依赖于域层,因为实体将在Repository实现中引用。
另一方面,如果在域中使用基础结构服务,则Domain层可以引用基础结构层。
这不会创建循环引用吗?
答案 0 :(得分:13)
查看onion architecture它显示了DDD解决方案的良好设置。
基本上,域服务的所有域模型和接口都被视为核心。图层仅依赖于靠近核心的图层。它们的实际实施由基础设施处理。
域项目不应该引用基础设施项目。如果域需要使用某些东西,则应将其定义为域内的接口并在基础结构项目中实现。
最终,您的界面定义了您的应用程序。实现方式的逻辑是外化的。所以我希望你有一个包含域模型和域服务的程序集,一个前端(例如MVC等),然后是一个基础架构程序集,它实现像NHibernate这样的东西来提供数据等。
您可以在链接文章的各个部分中看到实现该体系结构的各种示例。最简单的是here
您可以看到与其相关的问题here
主要的好处是,主要是基础设施问题最常发生变化。新的数据层技术,新的文件存储等。此外,您的核心域应该相当稳定,因为它没有实现任何仅通过合同(接口)定义它所需要的东西。通过将实现问题放在一个位置,可以最大限度地减少程序集中所需的更改量。
答案 1 :(得分:0)
在您的情况下是的。我有同样的问题:)
以下是我的解释:
基础设施层似乎是埃里克·埃文斯的一个特殊层面。 arichitecture图。它实现了接口,应用程序,域。
这是一种牵强的......
但另一方面,您可以将基础设施拆分为单独的适配器模块,因为基础设施组件通常由适配器,翻译器和外墙组成。
例如,
1)如果将MailManager注入DomainService,域可能依赖于邮件。 2)持久性依赖于域(存储库案例)。
但是如果你将邮件和持久性分成两个模块,那么它们就没有相互依赖。我认为这可以缓解这个问题。
毕竟,分层是一种解耦组件而非目的的方法。
最后但并非最不重要的是,我期待更多可靠的答案:)