域驱动设计存储库与Spring Data存储库之间是否存在不匹配?

Som*_*kar 15 domain-driven-design ddd-repositories spring-data spring-data-jpa

DDD指定每个聚合的存储库,但是当采用Spring Data JPA时,我们只有在声明每个实体的接口时才能利用这些优势.如何解决阻抗不匹配问题?

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

到给定的一个例子:Customer是聚合根和实体等Demographics,Identification,AssetSummary等等,其中每个实体可以从具有自己的资源库接口受益.没有违反DDD的最佳方法是什么?

Oli*_*ohm 19

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

这是错的,我想知道你从哪里得到这种印象(随意评论).Spring Data存储库期望与您的域模型设计完全相同:您可以在域模型中识别聚合,并仅为这些聚合创建存储库接口.

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

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

事实上,这种特殊关系是使Spring Data REST等模块首先运行的基本原则.它仅为聚合根公开HTTP资源,在创建的表示中嵌入普通实体,并创建指向其他聚合的链接.

  • *不包含*在另一个聚合中的实体当然也可以获取它们的存储库.我通常将它们视为单实体聚合,实体是聚合根本身.该模式的重要部分是,除了通过聚合外,不得操纵聚合中包含的实体.因此,并非每个JPA实体都在其侧面获得Spring Data存储库. (3认同)