這里以極快的速度構(gòu)建好博客應用程序,這在很大程度上要歸功于Castle ActiveRecord框架,由于對象模型與數(shù)據(jù)模型之間緊密相關(guān),它能夠?qū)?shù)據(jù)的檢索和訪問操作自動化。
Active Record模式并非靈丹妙藥。它擅長于處理底層數(shù)據(jù)模型能夠很好映射到業(yè)務模型的情形,但是當出現(xiàn)不匹配時(有時候稱為阻抗失配),該模式將很難應對。這是由于復雜系統(tǒng)的概念業(yè)務模型有時與數(shù)據(jù)模型不同所造成的。如果業(yè)務領(lǐng)域非常豐富,有著大量的復雜規(guī)則、邏輯和工作流,那么采用Domain Model方法將更加有利。這正是4.1.3小節(jié)中要討論的模式。
4.1.3 Domain Model
可以將Domain Model視為表示正在處理的領(lǐng)域的概念層。事物以及事物之間的關(guān)系都存在于這個模型中。這里的“事物”表示什么意思呢?例如,如果正在構(gòu)建一個電子商務商店,那么這個模型中的“事物”將表示購物車、訂單、訂單項及類似的事物。這些事物包含數(shù)據(jù),更重要的是它們還有行為。一張訂單不僅有表示創(chuàng)建日期、狀態(tài)和訂單流水號的屬性;還包含應用到憑證的業(yè)務邏輯,其中包括圍繞它的所有領(lǐng)域規(guī)則:憑證是否有效?該憑證能否用于購物車中的商品?是否存在任何其他導致該憑證失效的出價?Domain Model越能密切地表示真實的領(lǐng)域越好,這是因為更容易理解和復制組織中的復雜的業(yè)務邏輯、規(guī)則和驗證過程。Domain Model與Active Record模式之間的主要差別在于,Domain Model中存在的業(yè)務實體并不知道如何持久化自己,而且沒有必要在數(shù)據(jù)模型和業(yè)務模型之間建立一對一的映射關(guān)系。
1. POCO和PI
前面曾經(jīng)提到過,Domain Model與Active Record模式不同,它不知道持久化。術(shù)語持久化不知(persistence ignorance,PI)表示普通CLR對象(plain old common runtime object,POCO)業(yè)務實體的樸實本質(zhì)。那么如何將Domain Model的業(yè)務對象持久化呢?通常使用Repository模式(第7章)。采用Domain Model模式時,Repository對象以及數(shù)據(jù)映射器(第7章)負責將業(yè)務實體及相關(guān)實體的對象圖映射到數(shù)據(jù)模型。
2. 代碼示例
為了演示Domain Model模式,將創(chuàng)建一個解決方案來為銀行領(lǐng)域建模,這涉及賬號的創(chuàng)建以及賬號之間的現(xiàn)金轉(zhuǎn)賬。
創(chuàng)建一個名為ASPPatterns.Chap4.DomainModel的新的解決方案,并向其中添加下面的類庫項目:
● ASPPatterns.Chap4.DomainModel.Model
● ASPPatterns.Chap4.DomainModel.AppService
● ASPPatterns.Chap4.DomainModel.Repository
此外還添加一個新的Web應用程序ASPPatterns.Chap4.DomainModel.UI.Web。在Repository項目上右擊,并添加對Model項目的項目引用。在AppService項目上右擊,添加對Model和Repository項目的項目引用。最后,在Web項目上右擊,添加對AppService項目的項目引用。