数据访问层应该知道域吗?

时间:2015-02-25 16:40:11

标签: architecture domain-driven-design

我们正在开发遵循域驱动设计和分层软件架构的Web应用程序,其中包含以下层:

  • 演示文稿(REST API)
  • 域(实体,DDD中定义的具有特定于域的行为的值对象)
  • 数据访问(DAO classess访问数据库)

上面的每一个都是一个单独的maven模块,具有向下依赖性,i.d。演示文稿取决于数据访问的域和域。

数据访问层是否应该返回域类的实例,还是应该在域和数据访问层之间存在隔离?

3 个答案:

答案 0 :(得分:7)

是的,您的基础架构层应该知道您的域名的所有内容。具体的存储库类通过提供所需的必要实现来支持您的抽象域接口。

您的基础架构层将依赖于您的域图层。

在域驱动设计中帮助您的伟大架构模式是洋葱架构。阅读this article by Jeffery Palermo

答案 1 :(得分:4)

DDD中的一个常见持久性抽象是使用Repository模式。

您将在域中定义存储库的接口,合同将基于域概念。因此,是的,您将聚合根实体直接传递给存储库,查询方法也可以直接返回聚合根。

请注意,存储库实现将存在于基础架构层中,而不是域中。

答案 2 :(得分:0)

从长远来看,分开关注总是更好。域接口用于域的客户端执行特定于域的任务,而数据访问层用于存储和检索持久存储中的对象。如果域接口也用于持久性,则实现细节很容易泄漏到域的接口中。

对我来说,DDD层更多地是关于公共接口(合同)的组织,而不是如何提供内部实现。从这个角度来看,如果内部实现在同一个程序集中 - 并且因此层 - 作为公共接口,或者提供依赖性反转,则它并不重要。这些 - 以及实现的位置 - 仅仅是实现细节。