1.引言
在針對大型的復(fù)雜領(lǐng)域進(jìn)行建模時,聚合、實(shí)體和值對象之間的依賴關(guān)系可能會變得十分復(fù)雜。在某個對象中為了確保其依賴對象的有效實(shí)例被創(chuàng)建,需要深入了解對象實(shí)例化邏輯,我們可能需要加載其他相關(guān)對象,且可能為了保持其他對象的領(lǐng)域不變性增加了額外的業(yè)務(wù)邏輯,這樣即打破了領(lǐng)域的單一責(zé)任原則(SRP),又增加了領(lǐng)域的復(fù)雜性。
那如何去創(chuàng)建復(fù)雜的領(lǐng)域?qū)ο竽??因?yàn)閺?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á)對象實(shí)例化的意圖。
而工廠模式是計模式中的創(chuàng)建類模式之一。借助工廠模式我們可以很好實(shí)現(xiàn)DDD中領(lǐng)域?qū)ο蟮膭?chuàng)建。
而針對工廠模式的實(shí)現(xiàn)主要有四種方式:
簡單工廠:簡單實(shí)用,但違反開放封閉;
工廠方法:開放封閉,單一產(chǎn)品;
抽象工廠:開放封閉,多個產(chǎn)品;
反射工廠:可以最大限度的解耦。
具體實(shí)現(xiàn)可以參考創(chuàng)建相似對象,就交給『工廠模式』吧。
3.封裝內(nèi)部結(jié)構(gòu)
當(dāng)需要為聚合添加元素時,我們不能暴露聚合的結(jié)構(gòu)。我們以添加商品到購物車為例,來講解如何一步一步的使用工廠模式。
一般來說,添加到購物車需要幾個步驟:
加載用戶購物車
獲取商品稅率
創(chuàng)建新的購物車子項(xiàng)
相關(guān)的應(yīng)用層代碼如下:
namespace Application { public class AddProductToBasket { // ...... public void Add (Product product, Guid basketId) { var basket = _basketRepository.FindBy (basketId); &n