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