3

下面是一個很好的設計,可以在洋蔥結構和域驅動設計中使用嗎?域模型應該調用基礎設施接口嗎?

說你有一個像這樣

class Order 
{ 
    INotificationService _notificationService; 
    ICartRepository _cartRepository; 

    void Checkout(Cart cart, bool notifyCustomer) 
    { 
     _cartRepository.Save(cart); 
     if (notifyCustomer) 
     { 
      _notificationService.sendnotification(); 
     } 
    } 
} 

的「訂單」領域類是好還是壞的設計有基礎設施的領域模型調用接口?(在這種情況下,notificationservice和CartRepository)

+0

您確定致電客戶通知是您訂單的關注點嗎?這似乎是我對應用程序級別的關注。當客戶退房時,未來需要採取的措施如何爲將來的銷售提供信貸,通知您的內部統計數據庫和其他簿記等?你是否總是要修改你的訂單類?對於SPR原則,我建議像下面的答案一樣提出域名事件,並由獨立觀察員處理該事件。 –

回答

1

我認爲INotificationService是一個領域概念而不是基礎設施服務。我們可以將此模型設置爲DomainEvent,告訴「客戶關於購物車已保存」。

如何將INotificationService移動到域圖層並將其重命名爲「CartDomainEvents」。

CartDomainEvents.raise(CartSavedEvent(...)); 

在一般情況下,調用基礎結構組件引入雙向依賴關係,這通常不是一個好設計。

+0

''調用基礎設施組件引入了通常不是好設計的雙向依賴性「。你絕對是對的,但請記住,在洋蔥體系結構中,所有依賴關係都朝向中心!所以不應該允許雙向依賴關係! – MaxSC

1

你的設計將是確定只有兩個INotificationServiceICartRepository接口中定義的DomainCore)層如果他們通過您的Dependency Resolution層(您洋蔥的最外層,在運行時綁定正確的實現建築)。

請記住,在洋蔥架構,您Domain層不能引用任何庫。

ICartRepository實現顯然將在您的Infrastucture層完成,因爲它肯定會與您的數據訪問層技術綁定。
如果您的INotificationService實施需要與外部服務通話,那麼它也會轉至Infrasrtructure。但如果它是你的業務的一部分,那麼它的實現可能在Domain層。

0

庫層是存在域的每個聚集,倉庫是域的頂部,你可以有自己生活在基礎設施誰在你的域庫的基本接口,但你不能看到你的模型庫實現(這不是正確)。 這裏有一些基本的接口,比如UnitOfWrok,Repository,Specificationm認證和...在您的基礎設施中可以在所有層訪問。我建議看看aghata店面.NET編寫看到一個真正的實施項目https://github.com/elbandit/Asp-Net-Design-Patterns-CQRS

0

資源庫屬於基礎設施層 也將更好地使用ICART接口

void Checkout(ICart cart, bool notifyCustomer) 

,以降低耦合。