【问题标题】:Should the data access layer know the domain?数据访问层应该知道域吗?
【发布时间】:2015-04-27 18:37:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: architecture domain-driven-design


    【解决方案1】:

    是的,您的基础设施层应该了解您的域的所有信息。具体的存储库类通过提供所需的必要实现来支持您的抽象域接口。

    您的基础设施层将依赖于您的域层。

    洋葱架构是一种可以帮助您进行领域驱动设计的优秀架构模式。阅读this article by Jeffery Palermo

    【讨论】:

      【解决方案2】:

      DDD 中一种常见的持久性抽象是使用存储库模式。

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

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

      【讨论】:

      • 但是基础设施层内的存储库实现必须依赖于领域层的存储库接口,这会破坏分层软件架构,因为向下层(基础设施/数据访问)不能依赖于向上层(域)。
      • @AdamSiemion 没错,但这就是为什么DIP 比传统的分层架构更受青睐的原因。
      • @AdamSiemion 它不会破坏任何东西。分层不是必须做的,它只是关注点分离的效果。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多