我们正在开发遵循域驱动设计和分层软件架构的Web应用程序,其中包含以下层:
上面的每一个都是一个单独的maven模块,具有向下依赖性,i.d。演示文稿取决于数据访问的域和域。
数据访问层是否应该返回域类的实例,还是应该在域和数据访问层之间存在隔离?
答案 0 :(得分:7)
是的,您的基础架构层应该知道您的域名的所有内容。具体的存储库类通过提供所需的必要实现来支持您的抽象域接口。
您的基础架构层将依赖于您的域图层。
在域驱动设计中帮助您的伟大架构模式是洋葱架构。阅读this article by Jeffery Palermo。
答案 1 :(得分:4)
DDD中的一个常见持久性抽象是使用Repository模式。
您将在域中定义存储库的接口,合同将基于域概念。因此,是的,您将聚合根实体直接传递给存储库,查询方法也可以直接返回聚合根。
请注意,存储库实现将存在于基础架构层中,而不是域中。
答案 2 :(得分:0)
从长远来看,分开关注总是更好。域接口用于域的客户端执行特定于域的任务,而数据访问层用于存储和检索持久存储中的对象。如果域接口也用于持久性,则实现细节很容易泄漏到域的接口中。
对我来说,DDD层更多地是关于公共接口(合同)的组织,而不是如何提供内部实现。从这个角度来看,如果内部实现在同一个程序集中 - 并且因此层 - 作为公共接口,或者提供依赖性反转,则它并不重要。这些 - 以及实现的位置 - 仅仅是实现细节。