【问题标题】:Is there a mismatch between Domain-Driven Design repositories and Spring Data ones?领域驱动设计存储库和 Spring Data 存储库之间是否存在不匹配?
【发布时间】:2016-11-27 02:02:40
【问题描述】:

DDD 为每个聚合指定存储库,但是在采用 Spring Data JPA 时,我们只有在为每个实体声明接口时才能利用这些好处。这种阻抗不匹配如何解决?

我希望尝试封装在聚合存储库中的存储库接口,这是一个好的解决方案还是更好的解决方案?

举个例子:Customer 是聚合根,实体如DemographicsIdentificationAssetSummary 等,每个实体都可以从拥有自己的存储库接口中受益。在不违反 DDD 的情况下,最好的方法是什么?

【问题讨论】:

    标签: spring-data domain-driven-design spring-data-jpa ddd-repositories


    【解决方案1】:

    ...,但是当采用 Spring Data JPA 时,我们只有在为每个实体声明接口时才能利用这些好处...

    这是错误的,我想了解您从哪里获得这种印象(请随时发表评论)。 Spring Data 存储库期望您的域模型设计采用完全相同的方法:您识别域模型中的聚合,并仅为这些聚合创建存储库接口。

    我认为您需要做的就是将 DDD 概念应用于您的域模型。简单地不要为不是聚合根的实体声明存储库接口。事实上,如果你声明了这些,你基本上打破了聚合的概念,因为实际的根不能再控制业务约束,因为其他实体可以通过为它们定义的存储库接口进行操作,即不使用聚合根。

    Spring Data example 中找到正确应用的示例。其中,Order 是聚合根,LineItem 只是一个普通实体。这同样适用于Customer(根)和Address(普通实体)。存储库接口仅存在于聚合根。

    事实上,这种特殊的关系是让 Spring Data REST 等模块首先工作的基本原则。它只公开聚合根的 HTTP 资源,将普通实体嵌入到创建的表示中,并创建到其他聚合的链接。

    【讨论】:

    • 感谢您的回答。我在尝试考虑将实体作为聚合的一部分的可能性时出现了这个问题,该聚合没有或不需要到聚合根的关系映射,我想这可以通过聚合的自定义存储库 impl 来实现根,我错了吗?
    • 进一步,当我不得不使用这种自定义 impl 时,我或多或少开始放弃 Spring Data 的好处(如果我的上述假设成立)
    • 在另一个聚合中不包含的实体当然也可以获取它们的存储库。我通常将它们视为单个实体聚合,实体是聚合根本身。该模式的重要部分是聚合中包含的实体不得被操纵,除非通过聚合。因此,并非每个 JPA 实体都有一个 Spring Data 存储库。
    • 完全相同的方法?真的吗?曾经尝试设计一个价值对象。无论添加多少接口,在没有 \@Id 的情况下持久化对象都不是那么容易。当然,我们可以嵌入它们,但这并不代表模型。大多数是另一个obj的依赖项,但没有被它们封装......绝对没有定义在另一个obj的范围内。海事组织最好给他们身份。至少这不会减慢数据库的速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多