域服务实现应该位于DDD项目结构中的哪个位置?
如果我们实施IDomainInterface
和DomainInterface
,那么DomainInterface
实施是否应位于解决方案/项目的基础架构或核心/域部分中?
答案 0 :(得分:5)
域服务接口及其实现可以驻留在域层中。但是,如果域服务实现依赖于基础结构问题,那么通过应用依赖性倒置原则,实现将存在于基础结构层中,同时取决于域中定义的接口。
大多数域服务不需要依赖于基础架构问题,并且将用于模拟在现有聚合中找不到自然家庭的用例,但某些域服务将会。
存储库是最常见的域服务,需要基础架构知识,因此您会发现它们的实现存在于基础架构层中,但还有其他示例。
例如,在IDDD的Identity&访问有界上下文,EncryptionService接口存在于域中,而MD5EncryptionService具体实现存在于基础结构中。
答案 1 :(得分:1)
域服务的接口和实现都应该驻留在域(核心)层中。更具体地说,接口和实现应该与服务使用的域对象位于同一个模块(命名空间)中。
实施的位置定义了它的服务类型,即应用程序,域或基础架构服务。
小心将域概念建模为服务,因为它可以导致域逻辑驻留在服务中而不是实体和值对象中的anemic domain model。
答案 2 :(得分:0)
洋葱或六角形体系结构表示基础结构层取决于内层。 如果合同存在于“域”层中,那是因为它代表了某种业务需求,某种代表了无处不在的语言,因此我将其视为域服务。
如果域服务实现需要某些特定技术(例如数据库访问或SMTP服务器访问等),则其实现必须位于基础结构层中。域根本不关心实现,如果业务专家谈论某件事并且我们决定将此“某事”作为合同,则它必须存在于域层中。都是关于域语言的。
根据定义,基础结构服务不应位于“域”层中。如果它与基础架构有关,那么我怀疑这与普遍存在的语言有关。我希望看到基础结构服务合同存在于应用程序层中,因为按照定义,应用程序层是帮助域的编排层。如果实现需要某些特定技术,那么实现将在基础架构层中进行。
因此,总结并回答这个问题: 将域服务实现放在哪里?这取决于:
最后,重要的是,在Domain中,我们关心通用语言;在应用程序中,我们根据自己的依赖关系编排领域,并且将实现放置在有意义的位置(领域不能依赖于任何事物,应用程序只能取决于域)。