DDD:在哪里实施域名服务

时间:2016-09-21 08:14:05

标签: domain-driven-design project-structure

域服务实现应该位于DDD项目结构中的哪个位置? 如果我们实施IDomainInterfaceDomainInterface,那么DomainInterface实施是否应位于解决方案/项目的基础架构或核心/域部分中?

3 个答案:

答案 0 :(得分:5)

域服务接口及其实现可以驻留在域层中。但是,如果域服务实现依赖于基础结构问题,那么通过应用依赖性倒置原则,实现将存在于基础结构层中,同时取决于域中定义的接口。

大多数域服务不需要依赖于基础架构问题,并且将用于模拟在现有聚合中找不到自然家庭的用例,但某些域服务将会。

存储库是最常见的域服务,需要基础架构知识,因此您会发现它们的实现存在于基础架构层中,但还有其他示例。

例如,在IDDD的Identity&访问有界上下文,EncryptionService接口存在于域中,而MD5EncryptionService具体实现存在于基础结构中。

答案 1 :(得分:1)

域服务的接口和实现都应该驻留在域(核心)层中。更具体地说,接口和实现应该与服务使用的域对象位于同一个模块(命名空间)中。

实施的位置定义了它的服务类型,即应用程序,域或基础架构服务。

小心将域概念建模为服务,因为它可以导致域逻辑驻留在服务中而不是实体和值对象中的anemic domain model

答案 2 :(得分:0)

洋葱或六角形体系结构表示基础结构层取决于内层。 如果合同存在于“域”层中,那是因为它代表了某种业务需求,某种代表了无处不在的语言,因此我将其视为域服务。

如果域服务实现需要某些特定技术(例如数据库访问或SMTP服务器访问等),则其实现必须位于基础结构层中。域根本不关心实现,如果业务专家谈论某件事并且我们决定将此“某事”作为合同,则它必须存在于域层中。都是关于域语言的。

根据定义,基础结构服务不应位于“域”层中。如果它与基础架构有关,那么我怀疑这与普遍存在的语言有关。我希望看到基础结构服务合同存在于应用程序层中,因为按照定义,应用程序层是帮助域的编排层。如果实现需要某些特定技术,那么实现将在基础架构层中进行。

因此,总结并回答这个问题: 将域服务实现放在哪里?这取决于:

  • 如果实施不需要应用程序或特定技术的任何内容。将实现放在域层中。 (例如:计算出的订单号)
  • 如果实现需要应用程序层提供任何内容(例如,它需要访问Aggregate存储库,我认为该存储库位于应用程序层中),则将实现放在应用程序层中。
  • 如果实现需要特定的技术(例如访问SMTP服务器或具体的http客户端),则将其放置在基础结构层中。

最后,重要的是,在Domain中,我们关心通用语言;在应用程序中,我们根据自己的依赖关系编排领域,并且将实现放置在有意义的位置(领域不能依赖于任何事物,应用程序只能取决于域)。