基础架构层中的域驱动设计存储库实现

时间:2013-09-15 05:36:40

标签: domain-driven-design ddd-repositories

我对DDD分层架构的依赖关系提出了疑问。如果Repository实现位于基础结构层中,则意味着基础结构层依赖于域层,因为实体将在Repository实现中引用。

另一方面,如果在域中使用基础结构服务,则Domain层可以引用基础结构层。

这不会创建循环引用吗?

2 个答案:

答案 0 :(得分:13)

查看onion architecture它显示了DDD解决方案的良好设置。

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

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

最终,您的界面定义了您的应用程序。实现方式的逻辑是外化的。所以我希望你有一个包含域模型和域服务的程序集,一个前端(例如MVC等),然后是一个基础架构程序集,它实现像NHibernate这样的东西来提供数据等。

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

您可以看到与其相关的问题here

主要的好处是,主要是基础设施问题最常发生变化。新的数据层技术,新的文件存储等。此外,您的核心域应该相当稳定,因为它没有实现任何仅通过合同(接口)定义它所需要的东西。通过将实现问题放在一个位置,可以最大限度地减少程序集中所需的更改量。

答案 1 :(得分:0)

在您的情况下是的。我有同样的问题:)

以下是我的解释:

基础设施层似乎是埃里克·埃文斯的一个特殊层面。 arichitecture图。它实现了接口,应用程序,域。

enter image description here

这是一种牵强的......

但另一方面,您可以将基础设施拆分为单独的适配器模块,因为基础设施组件通常由适配器,翻译器和外墙组成。

例如,

1)如果将MailManager注入DomainService,域可能依赖于邮件。 2)持久性依赖于域(存储库案例)。

但是如果你将邮件和持久性分成两个模块,那么它们就没有相互依赖。我认为这可以缓解这个问题。

毕竟,分层是一种解耦组件而非目的的方法。

最后但并非最不重要的是,我期待更多可靠的答案:)