DDD:将域服务的实现放在哪里
DDD: Where to put implementation of domain services
域服务实现应该驻留在 DDD 项目结构中的什么位置?
如果我们有 IDomainInterface
和 DomainInterface
实施,DomainInterface
实施应该驻留在基础设施中还是 solution/project 的 Core/Domain 部分?
域服务接口及其实现可能位于域层。但是,如果域服务实现依赖于基础架构问题,那么通过应用依赖倒置原则,实现将存在于基础架构层中,同时依赖于域中定义的接口。
大多数域服务将不需要依赖于基础架构问题,并将用于对无法在现有聚合中找到自然归宿的用例建模,但某些域服务会。
存储库是最常见的领域服务,需要基础架构知识,因此您会发现它们的实现存在于基础架构层中,但还有其他示例。
例如,在 IDDD 的身份和访问限界上下文中,EncryptionService interface lives in the domain while the MD5EncryptionService 具体实现存在于基础设施中。
洋葱或六边形架构表示基础设施层依赖于内层。
如果合约存在于领域层,那是因为它代表了一些业务需求,代表了无处不在的语言,因此我认为它是领域服务。
如果域服务实现需要某些特定技术(例如数据库访问或 SMTP 服务器访问或其他),则其实现必须位于基础结构层中。域根本不关心实现,如果业务专家谈论某事并且我们决定将此 "something" 设为合同,则它必须存在于域层中。都是关于领域语言的。
根据定义,基础架构服务不应位于领域层。如果它与基础设施有关,那么我怀疑它与无处不在的语言有什么关系。我希望看到基础设施服务合同存在于应用程序层中,因为根据定义,应用程序层是帮助域的编排层。如果实施需要一些特定的技术,同样,实施将在基础设施层。
因此,总结并回答这个问题:
在哪里放置域服务实现?这取决于:
- 如果实施不需要应用程序或特定技术的任何东西。将实现放在领域层。 (示例:计算出的订单号)
- 如果实现需要来自应用层的任何东西(例如,它需要访问聚合存储库,在我看来它位于应用层),那么将实现放在应用层中。
- 如果实施需要特定技术(例如访问 SMTP 服务器或具体的 http 客户端),则将其置于基础设施层。
最后,重要的是在域中我们关心无处不在的语言,在应用程序中我们编排域并且实现根据它们的依赖项放置在有意义的地方(域不能依赖任何东西,应用程序只能依赖域)。
域服务实现应该驻留在 DDD 项目结构中的什么位置?
如果我们有 IDomainInterface
和 DomainInterface
实施,DomainInterface
实施应该驻留在基础设施中还是 solution/project 的 Core/Domain 部分?
域服务接口及其实现可能位于域层。但是,如果域服务实现依赖于基础架构问题,那么通过应用依赖倒置原则,实现将存在于基础架构层中,同时依赖于域中定义的接口。
大多数域服务将不需要依赖于基础架构问题,并将用于对无法在现有聚合中找到自然归宿的用例建模,但某些域服务会。
存储库是最常见的领域服务,需要基础架构知识,因此您会发现它们的实现存在于基础架构层中,但还有其他示例。
例如,在 IDDD 的身份和访问限界上下文中,EncryptionService interface lives in the domain while the MD5EncryptionService 具体实现存在于基础设施中。
洋葱或六边形架构表示基础设施层依赖于内层。 如果合约存在于领域层,那是因为它代表了一些业务需求,代表了无处不在的语言,因此我认为它是领域服务。
如果域服务实现需要某些特定技术(例如数据库访问或 SMTP 服务器访问或其他),则其实现必须位于基础结构层中。域根本不关心实现,如果业务专家谈论某事并且我们决定将此 "something" 设为合同,则它必须存在于域层中。都是关于领域语言的。
根据定义,基础架构服务不应位于领域层。如果它与基础设施有关,那么我怀疑它与无处不在的语言有什么关系。我希望看到基础设施服务合同存在于应用程序层中,因为根据定义,应用程序层是帮助域的编排层。如果实施需要一些特定的技术,同样,实施将在基础设施层。
因此,总结并回答这个问题: 在哪里放置域服务实现?这取决于:
- 如果实施不需要应用程序或特定技术的任何东西。将实现放在领域层。 (示例:计算出的订单号)
- 如果实现需要来自应用层的任何东西(例如,它需要访问聚合存储库,在我看来它位于应用层),那么将实现放在应用层中。
- 如果实施需要特定技术(例如访问 SMTP 服务器或具体的 http 客户端),则将其置于基础设施层。
最后,重要的是在域中我们关心无处不在的语言,在应用程序中我们编排域并且实现根据它们的依赖项放置在有意义的地方(域不能依赖任何东西,应用程序只能依赖域)。