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.封裝內部結構
當需要為聚合添加元素時,我們不能暴露聚合的結構。我們以添加商品到購物車為例,來講解如何一步一步的使用工廠模式。
一般來說,添加到購物車需要幾個步驟:
加載用戶購物車
獲取商品稅率
創(chuàng)建新的購物車子項
相關的應用層代碼如下:
namespace Application { public class AddProductToBasket { // ...... public void Add (Product product, Guid basketId) { var basket = _basketRepository.FindBy (basketId); &n