三、建立技術框架
這一點,是《領域驅動設計》這本書沒有過多提及的內容。這個需要結合你們公司的原來技術框架用最小化改造成本最大化收益的方式來建立領域驅動的技術框架。下面是一個可以廣泛使用的領域驅動的技術框架,可以在這之上增加更多的個性元素形成你公司自己的框架。

圖3 領域驅動設計參考技術框架圖
這個框架的各個元素基本上在 《領域驅動設計》一書中都可以找到對應的解釋,但這里需要解釋一下我建立這個框架的個性理解:
領域對外(頁面、AJAX、ESB調用)只暴露領域服務,其它所有領域類都是包內自閉的,對外不可見。
基礎倉庫的引入,基礎倉庫是一個抽象的倉庫,它封裝了大量常用工具方法、業務對象生命周期維護(實體OR映射、DAO調用)、外部接口調用。可以降低業務倉庫不必要的重復編碼與復雜性。業務倉庫是繼承基礎倉庫的子類。
基礎設施的引用,基礎設施是用來承載引用非領域調用的樁,我們在使用領域驅動設計的時候往往是從一個舊的系統重構開始。這時我們不可能要求所有的業務子系統相互調用都通過Domain Service調用,這時我們可以通過Infrastructure優美的把調用封裝在業務倉庫的業務方法內。
四、重構受影響領域的設計與編碼
圖4 重構后的商品詳情頁類圖
Spark以商品詳情頁這個Use Case為例展示了以領域驅動設計的重構類圖:
增加行為表ProductExt用于存儲商品的擴展信息,如預約時間段、預約醫院。并為表建立一一對應的實體Entity。
基礎倉庫Repository通過Infrastructure中的DAO封裝了對實體的操作,如create()、update()、delete()、findById()、findList()
商品業務倉庫ProductRepository擴展了基礎倉庫,客戶程序可以用productId為參數,通過ProductVo.getProduct()方法獲得商品詳細信息的業務實現,由于業務倉庫的的公開方法對外返回的都是Value Object,因此不會直接暴露Entity類型給客戶程序。
GetProductService服務類通過invoke()服務方法 對外(商品詳情頁面)提供服務,它通調用業務倉庫中的業務方法,并將接口規格化。
在Spark的幫助下,Jack Chen成功的脫離了困境。現在他正在公司里積極推行自己的領域驅動設計框架,他們公司的網站正在以每三周一次的重構速度快速迭代演進。他象Spark一樣,成為了一個領域驅動的布道者。
來源:InfoQ