DDD - 在 Spring 数据中维护单独的域 类 和实体 类

DDD - Maintaining separate Domain Classes and Entity Classes in Spring Data

我正在开发一个项目 Spring 启动项目,其中有两个单独的包,名为 domainpersistence

domain包主要包含域类(根据业务需求设计),而persistence包包含通过扩展[=提供的存储库定义的存储库接口17=].

我在域 类 中使用了 Spring Data JPA 注释,并且在定义存储库接口时也直接使用了那些 类。这里一切正常。

但我遇到的问题是,有人可能会争辩说域 类 不需要了解持久性实现,并且域 类 应该保持清洁而不污染 Spring Data JPA 注释.这让我觉得我应该使用一组不同的 类(假设实体 类 具有或多或少的属性)来实现持久性,以便我可以保持域 类 干净.但如果我这样做;

  1. Spring Data 存储库将与这些 Entity Classes 一起使用,我将无法使用开箱即用的基于接口的存储库,因为我将始终必须映射 Entity objects 由存储库返回到 Domain Classes.
  2. 我相信在某些时候,我也会引入DTOs,当我达到这个水平时,会有太多的映射(Entity ClassesDomain Classes然后Domain ClassesDTOs)。我个人认为这个映射在长运行.
  3. 中会是一个开销

总结- 我应该单独维护 Domain Model ClassesEntity Classes 还是应该只使用 Domain Model Classes 以及 Spring Data JPA 注释和 KISS?

我认为将存储库接口与域 classes 分开是错误的。存储库是域的一部分。他们的实现不是,但是您没有处理实现,因为它是由 Spring Data(和 JPA)提供的。

如果您的域 classes 和您的实体 classes 应该分开,则取决于它们是否有不同的需求。 您可能会遇到这样的情况,您需要对实体 classes 进行建模以适应 JPA 的限制或您使用的任何持久性技术,并且您不希望将其泄漏到您的域中。

但在你遇到之前我认为没有必要将它们分开。

如果您担心实体上的注释,意识到注释是一种极其弱的依赖性可能会有所帮助。即使在 class 路径上,您也可以在没有注释的情况下使用您的实体。所以从纯粹的角度来看它们是一种气味,但实际上我还是要找到它们有问题的情况。

如果您真的想摆脱它们,您可能需要研究 jMolecules,它为 DDD 概念提供技术不可知的注释,然后将其转换为 JPA 注释或您想要使用的任何内容。