1.引言

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

那如何去創(chuàng)建復(fù)雜的領(lǐng)域?qū)ο竽??因為?fù)雜的領(lǐng)域?qū)ο蟮纳芷诳赡苄枰獏f(xié)調(diào)才能進(jìn)行創(chuàng)建。 這個時候,我們就可以引入創(chuàng)建類模式——工廠模式來幫忙,將對象的使用與創(chuàng)建分開,將對象的創(chuàng)建邏輯明確地封裝到工廠對象中去。

2. DDD中的工廠

我們有必要先理清工廠和工廠模式。
DDD中工廠的主要目標(biāo)是隱藏對象的復(fù)雜創(chuàng)建邏輯;次要目標(biāo)就是要清楚的表達(dá)對象實例化的意圖。
而工廠模式是計模式中的創(chuàng)建類模式之一。借助工廠模式我們可以很好實現(xiàn)DDD中領(lǐng)域?qū)ο蟮膭?chuàng)建。

而針對工廠模式的實現(xiàn)主要有四種方式:

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

  • 工廠方法:開放封閉,單一產(chǎn)品;

  • 抽象工廠:開放封閉,多個產(chǎn)品;

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

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

3.封裝內(nèi)部結(jié)構(gòu)

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

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

  1. 加載用戶購物車

  2. 獲取商品稅率

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

相關(guān)的應(yīng)用層代碼如下:

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