正文

業(yè)務(wù)邏輯層:組織(29)

ASP.NET設(shè)計模式 作者:(美)Scott Millett


4. 聚合和聚合根

大型系統(tǒng)或復(fù)雜領(lǐng)域可能有成百上千的實體和值對象,它們有著錯綜復(fù)雜的關(guān)系。領(lǐng)域模型需要一種方法來管理這些關(guān)聯(lián),更重要的是,在邏輯上屬于同一分組的實體和值對象需要定義一個接口,讓其他實體能夠通過該接口與它們交互。如果沒有這類構(gòu)造,那么以后不同分組對象之間的交互將會相互干擾并產(chǎn)生問題。

聚合概念將邏輯實體和值對象分組。根據(jù)DDD的定義,聚合只是“一族出于數(shù)據(jù)變化目的而被視作一個單元的相關(guān)聯(lián)對象”。聚合根是一個實體,它是這個聚合中唯一能夠允許聚合外的對象持有引用的成員。DDD中的聚合概念是為了確保領(lǐng)域模型中的數(shù)據(jù)完整性。聚合根是一個充當(dāng)進(jìn)入聚合的邏輯途徑的特殊實體。例如,如果在電子商務(wù)商店上下文中獲取一張訂單,那么可以將其視為聚合根,因為我們只希望通過訪問聚合的根來編輯訂單項或應(yīng)用一張憑證。這使得復(fù)雜對象圖能夠保持一致,而且能夠遵守業(yè)務(wù)規(guī)則。因此,與其讓一個訂單對象通過簡單的List屬性來暴露它發(fā)出的憑證集合,不如讓它擁有一些帶有復(fù)雜規(guī)則的方法,能夠允許將憑證應(yīng)用到它并且把憑證列表表現(xiàn)為一個用于顯示的只讀集合。

5. 領(lǐng)域服務(wù)

在Domain Model模式銀行賬號練習(xí)中曾經(jīng)見到,BankAccountService類包含在兩個銀行賬號之間轉(zhuǎn)賬的邏輯。那些沒有真正位于單個實體中或者需要訪問資源庫的方法都被放到領(lǐng)域服務(wù)中。領(lǐng)域服務(wù)層還可以包含自己的領(lǐng)域邏輯,而且可以作為領(lǐng)域模型的重要組成部分,像實體和值對象一樣。

6. 應(yīng)用程序服務(wù)

應(yīng)用程序服務(wù)是位于領(lǐng)域模型之上的一個瘦層,負(fù)責(zé)協(xié)調(diào)應(yīng)用程序活動。它并不包含業(yè)務(wù)邏輯,也沒有保存任何實體的狀態(tài)。但它可以存放業(yè)務(wù)工作流事務(wù)的狀態(tài)。在領(lǐng)域模型銀行賬號練習(xí)中,可以采用Request-Reply消息傳送模式,使用應(yīng)用程序服務(wù)來提供訪問領(lǐng)域模型的API。

7. 資源庫

Repository模式(將在第7章中更詳細(xì)地研究)充當(dāng)業(yè)務(wù)實體的內(nèi)存集合或倉庫,它完全將底層的數(shù)據(jù)基礎(chǔ)設(shè)施抽象出來。該模式可用來將領(lǐng)域模型與任何基礎(chǔ)設(shè)施關(guān)注點分離,使其成為POCO和PI。

8. 分層

在DDD中,分層是一種重要的概念,因為它有助于加強關(guān)注點的分離。圖4-7所示為構(gòu)成DDD的各個層次和概念的圖形化表示。但應(yīng)該強調(diào)的是,在開發(fā)復(fù)雜業(yè)務(wù)應(yīng)用程序時,DDD更多地關(guān)乎心態(tài),而不是如何建立解決方案。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號