2016-09-21 172 views
0

域服务实现应该放在DDD项目结构中? 如果我们有IDomainInterfaceDomainInterface的实现,DomainInterface实现是否应该驻留在解决方案/项目的基础架构或核心/域部分?DDD:在哪里实施域服务

回答

2

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

大多数域服务将不需要依赖于基础设施问题,并且将用于建模在现有聚合中找不到自然住宅的用例,但某些域服务将会。

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

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

+0

域服务与基础设施无关 –

+1

只有基础设施问题,例如存储库,将在基础架构层中实施。域服务及其与存储库的交互将在域层中实现。 [AuthorizationService](https://github.com/VaughnVernon/IDDD_Samples_NET/blob/90fcc52d9c1af29640ec2a8a3e0e7c692f3e6663/iddd_identityaccess/Domain.Model/Access/AuthorizationService.cs)from [Implementing Domain-Driven Design](https://www.amazon.com)/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577)就是这样一个例子。 – Martin4ndersen

+0

@AlexeyZimarev知识库是一个域服务。尽管大多数域名服务不必依赖于基础设施的细节,但有些会。例如,您可以在身份和访问有界上下文中使用加密域服务,因为它使用某些第三方加密库,因此实施位于基础架构中。 – plalx

1

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

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

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

+0

这个答案是非常不正确的。例如,存储库是一个域服务,它的实现不应该存在于域中。 – plalx

+0

我同意存储库实现不应该存在于域中,因为它是基础设施服务,因此**不是域服务。其他人也表达了同样的观点“存储库的实施也是基础设施服务的一个例子。” - http://gorodinski.com/blog/2012/04/14/services-in-domain-driven-design-ddd/和http://stackoverflow.com/a/2279729/441292 – Martin4ndersen

+0

从域的角度来看,任何在域中定义的服务接口是域服务,与其实现无关。 – plalx