DDD中领域模型纯度与完整性如何抉择? - enterprisecraftsmanship


电子邮件唯一性检查属于业务逻辑,是应该放到领域模型User类中?还是UserController中?这里有领域模型完整性和纯度的抉择:

  • 领域域模型完整性是指您的域模型包含所有应用程序的域逻辑。按照这个依据,电子邮件唯一性检查属于领域逻辑,领域模型应该包含所有的领域逻辑,放入User中。
  • 域模型的纯洁是指您的域模型不涉及流程外的依赖项。按照这个依据,因为电子邮件的唯一性检查依赖其他选项,应该放入非领域模型的控制器UserController中。

业务逻辑是应用程序中最重要的部分。这也是其中最复杂的部分。将它与其他依赖的额外责任混合在一起,会使逻辑的复杂性变得更大。尽可能避免这种情况。领域域层应去除域逻辑本身以外的所有职责,保证纯度,纯度高于完整性。

三取二
在大多数使用情况下,不能同时具有以下所有3个属性:

  • 领域模型的完整性
  • 域模型纯度
  • 性能

共有三种常用方法,但是每种方法仅能为您提供3种属性中的2种:

  1. 将所有外部读取和写入推向业务操作的边缘-保留域模型的完整性和纯净性,但降低性能。
  2. 将业务流程外依赖项注入域模型中:保持性能和域模型的完整性,但要以牺牲领域模型的纯度为代价。
  3. 在域层和控制器之间分配决策过程:有助于提高性能和域模型的纯度,但是会降低完整性

如果您可以将所有外部读取和写入操作移至业务操作的边缘,而又不会对应用程序性能造成太大损害,请选择此选项。
否则,选择领域模型纯度而非完整性。