1.引言

在針對大型的復雜領域進行建模時,聚合、實體和值對象之間的依賴關系可能會變得十分復雜。在某個對象中為了確保其依賴對象的有效實例被創(chuàng)建,需要深入了解對象實例化邏輯,我們可能需要加載其他相關對象,且可能為了保持其他對象的領域不變性增加了額外的業(yè)務邏輯,這樣即打破了領域的單一責任原則(SRP),又增加了領域的復雜性。

那如何去創(chuàng)建復雜的領域對象呢?因為復雜的領域對象的生命周期可能需要協調才能進行創(chuàng)建。 這個時候,我們就可以引入創(chuàng)建類模式——工廠模式來幫忙,將對象的使用與創(chuàng)建分開,將對象的創(chuàng)建邏輯明確地封裝到工廠對象中去。

2. DDD中的工廠

我們有必要先理清工廠和工廠模式。
DDD中工廠的主要目標是隱藏對象的復雜創(chuàng)建邏輯;次要目標就是要清楚的表達對象實例化的意圖。
而工廠模式是計模式中的創(chuàng)建類模式之一。借助工廠模式我們可以很好實現DDD中領域對象的創(chuàng)建。

而針對工廠模式的實現主要有四種方式:

  • 簡單工廠:簡單實用,但違反開放封閉;

  • 工廠方法:開放封閉,單一產品;

  • 抽象工廠:開放封閉,多個產品;

  • 反射工廠:可以最大限度的解耦。

具體實現可以參考創(chuàng)建相似對象,就交給『工廠模式』吧。

3.封裝內部結構

當需要為聚合添加元素時,我們不能暴露聚合的結構。我們以添加商品到購物車為例,來講解如何一步一步的使用工廠模式。

一般來說,添加到購物車需要幾個步驟:

  1. 加載用戶購物車

  2. 獲取商品稅率

  3. 創(chuàng)建新的購物車子項

相關的應用層代碼如下:

namespace Application {    public class AddProductToBasket {        // ......
        public void Add (Product product, Guid basketId) {            var basket = _basketRepository.FindBy (basketId);    &n