2016-09-21 132 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