领域驱动设计存储库和 Spring 数据存储库之间是否存在不匹配?
Is there a mismatch between Domain-Driven Design repositories and Spring Data ones?
DDD 指定每个聚合的存储库,但是当采用 Spring Data JPA 时,我们只有在为每个实体声明接口时才能利用这些好处。如何解决这种阻抗失配问题?
我希望尝试封装在聚合存储库中的存储库接口,这是一个可行的解决方案还是更好的解决方案?
举个例子:Customer
是聚合根,实体就像 Demographics
、Identification
、AssetSummary
等,其中每个实体都可以从拥有自己的实体中受益自己的存储库接口。在不违反 DDD 的情况下最好的方法是什么?
…, but when embracing Spring Data JPA, we can leverage the benefits only when we declare interface per entity…
这是错误的,我想了解您是从哪里得到这种印象的(请随时发表评论)。 Spring 数据存储库期望对域模型设计采用完全相同的方法:您在域模型中识别聚合并仅为这些聚合创建存储库接口。
我认为您需要做的就是将 DDD 概念应用到您的域模型中。不要为不是聚合根的实体声明存储库接口。事实上,如果你声明了那些,你基本上打破了聚合的概念,因为实际的根不再能控制业务约束,因为其他实体可以通过为它们定义的存储库接口来操作,即不使用聚合根。
在此 Spring Data example 中找到正确应用此方法的示例。其中,Order
是一个聚合根,LineItem
只是一个普通实体。这同样适用于 Customer
(root)和 Address
(普通实体)。存储库接口仅存在于聚合根。
事实上,这种特殊关系是使 Spring Data REST 等模块首先工作的基本原则。它只公开聚合根的 HTTP 资源,在创建的表示中嵌入普通实体并创建到其他聚合的链接。
DDD 指定每个聚合的存储库,但是当采用 Spring Data JPA 时,我们只有在为每个实体声明接口时才能利用这些好处。如何解决这种阻抗失配问题?
我希望尝试封装在聚合存储库中的存储库接口,这是一个可行的解决方案还是更好的解决方案?
举个例子:Customer
是聚合根,实体就像 Demographics
、Identification
、AssetSummary
等,其中每个实体都可以从拥有自己的实体中受益自己的存储库接口。在不违反 DDD 的情况下最好的方法是什么?
…, but when embracing Spring Data JPA, we can leverage the benefits only when we declare interface per entity…
这是错误的,我想了解您是从哪里得到这种印象的(请随时发表评论)。 Spring 数据存储库期望对域模型设计采用完全相同的方法:您在域模型中识别聚合并仅为这些聚合创建存储库接口。
我认为您需要做的就是将 DDD 概念应用到您的域模型中。不要为不是聚合根的实体声明存储库接口。事实上,如果你声明了那些,你基本上打破了聚合的概念,因为实际的根不再能控制业务约束,因为其他实体可以通过为它们定义的存储库接口来操作,即不使用聚合根。
在此 Spring Data example 中找到正确应用此方法的示例。其中,Order
是一个聚合根,LineItem
只是一个普通实体。这同样适用于 Customer
(root)和 Address
(普通实体)。存储库接口仅存在于聚合根。
事实上,这种特殊关系是使 Spring Data REST 等模块首先工作的基本原则。它只公开聚合根的 HTTP 资源,在创建的表示中嵌入普通实体并创建到其他聚合的链接。