日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

走向.NET架构设计—第四章—业务层分层架构(后篇)

發(fā)布時(shí)間:2025/7/14 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 走向.NET架构设计—第四章—业务层分层架构(后篇) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
走向.NET架構(gòu)設(shè)計(jì)第四章業(yè)務(wù)層分層架構(gòu)(后篇)   前言: 在上一篇文章中,我們討論了組織業(yè)務(wù)邏輯的模式:Transaction ScriptActive RecordDomain Model。在本篇中開(kāi)始講述Anemic Model 今天的內(nèi)容比較簡(jiǎn)單,也是本章的一個(gè)收尾! 本篇議題如下: Transaction Scrip(前篇) Active Record前篇) Domain Model(中篇) Anemic Model(后篇) DDD(后篇) ?    ?   Anemic Domain Model ???? 初看起來(lái),貧血型領(lǐng)域模型和Domain Model模式很像。但是它們確實(shí)是不同的:Domain Model的領(lǐng)域類中包含了自身的業(yè)務(wù)邏輯和數(shù)據(jù),以及對(duì)象之前的關(guān)系;Anemic Domain Model的領(lǐng)域類將與自身相關(guān)的業(yè)務(wù)處理邏輯全部轉(zhuǎn)移到了模型之外——有專門(mén)的業(yè)務(wù)規(guī)則類,這使領(lǐng)域類成為了一個(gè)簡(jiǎn)單的數(shù)據(jù)對(duì)象。 這種模式的缺點(diǎn)就是:領(lǐng)域服務(wù)類中的代碼更加結(jié)構(gòu)化了,和Transaction Script模式很像,這也就會(huì)帶來(lái)和Transaction Script模式一樣的問(wèn)題。例如,其中一個(gè)就是違背了“Tell, Dont Ask”原則:業(yè)務(wù)對(duì)象原本應(yīng)該告訴客戶代碼它們是否能執(zhí)行某個(gè)操作,而不是讓客戶代碼根據(jù)業(yè)務(wù)對(duì)象的狀態(tài)來(lái)自己判斷是否該執(zhí)行,現(xiàn)在因?yàn)樗羞壿嬕呀?jīng)從業(yè)務(wù)類中移出了,業(yè)務(wù)類已經(jīng)沒(méi)有 “自主能力”了。 如果采用Anemic Domain Model來(lái)實(shí)現(xiàn)前面的訂單處理相關(guān)例子,Order業(yè)務(wù)類的代碼則如下所示: ? public?class?Order
????{
????????public?string?OrderNo?{?get;?set;?}
????????public?OrderStatus?Status?{?get;?set;?}
????????public?List<OrderItem>?Items?{?get;?set;?}????????
????} ? 復(fù)制代碼 Order的業(yè)務(wù)規(guī)則會(huì)放在特定的規(guī)則類中,如下所示: ? public?class?PorcessStatusSpecification
????{???????
????????public?bool?IsSatisfiedBy(Order?order)
????????{
????????????return?order.Status?!=?OrderStatus.Processed;
????????}
????} 復(fù)制代碼 ? 現(xiàn)在OrderService領(lǐng)域服務(wù)類的方法如下所示:<?XML:NAMESPACE PREFIX = O />

public?bool?OrderProcess(Order?requestOrder)
?????{
????????????bool?result?=?false;
????????????var?order?=?requestOrder;
????????????ProductService?productService?=?null;

????????????if?(order?!=?null)
????????????{
????????????????PorcessStatusSpecification?specification?=?new?PorcessStatusSpecification();
????????????????if?(specification.IsSatisfiedBy(order))
????????????????{
????????????????????productService?=?new?ProductService();
????????????????????var?hasInventory?=?productService.CheckInventory(order);
????????????????????if?(hasInventory)
????????????????????{
????????????????????????order.Status?=?OrderStatus.Processed;
????????????????????????//...
????????????????????}
????????????????}
????????????}

????????????return?result;
?????} ? 復(fù)制代碼 從上面的代碼可以看出:OrderService完全取代了原本的Order,而且還會(huì)為Order修改狀態(tài)。隨著邏輯的復(fù)雜性增強(qiáng),在服務(wù)類中會(huì)出現(xiàn)很多的輔助方法,這會(huì)導(dǎo)致服務(wù)類最后和Transaction Script一樣變得無(wú)法維護(hù)。  到這里為止,四種組織業(yè)務(wù)邏輯的模式就講述完了,每一種都有自己的用途,無(wú)所謂“一定用,或者一定不用”。到底是用哪種,都是根據(jù)項(xiàng)目和經(jīng)驗(yàn)而定。   DDD   下面我們就來(lái)進(jìn)入DDD,這里只是講述了一下DDD中的一些基本概念,至于具體的講述DDD   1.?????? 后面的章節(jié)會(huì)陸續(xù)的介紹   2.?????? 閱讀《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì).軟件核心復(fù)雜性應(yīng)對(duì)之道》,如果朋友們有需要,留下自己的Email,我會(huì)發(fā)送給大家。   下面的一些的文字都是摘自一些書(shū)籍。目的只是一個(gè)為了讓大家快速的了解一下DDD   DDD幾個(gè)概念:   分層架構(gòu)   實(shí)體   值對(duì)象   服務(wù)   模塊   聚合   工廠 ? ?   分層架構(gòu)   當(dāng)我們創(chuàng)建一個(gè)軟件應(yīng)用時(shí),這個(gè)應(yīng)用的很大一部分是不能直接跟領(lǐng)域關(guān)聯(lián)的,但它們是基礎(chǔ)設(shè)施的一部分或者是為軟件服務(wù)的。最好能讓?xiě)?yīng)用中的領(lǐng)域部分盡可能少地和其他的部分摻雜在一起,因為一個(gè)典型的應(yīng)用包含了很多和數(shù)據(jù)庫(kù)訪問(wèn),文件或網(wǎng)絡(luò)訪問(wèn)以及用戶界面等相關(guān)的代碼。 ?   在一個(gè)面向?qū)ο蟮某绦蛑?#xff0c;用戶界面、數(shù)據(jù)庫(kù)以及其他支持性代碼經(jīng)常被直接寫(xiě)到業(yè)務(wù)對(duì)象中。附加的業(yè)務(wù)邏輯被嵌入到UI 組件和數(shù)據(jù)庫(kù)腳本的行為中。之所以這樣做的某些原因是這樣可以很容易地讓事情快速工作起來(lái)。 ?   但是,當(dāng)領(lǐng)域相關(guān)的代碼被混入到其他層時(shí),要閱讀和思考它也變得極其困難。表面看上去是對(duì)UI 的修改,卻變成了對(duì)業(yè)務(wù)邏輯的修改。對(duì)業(yè)務(wù)規(guī)則的變更可能需要謹(jǐn)慎跟蹤用戶界面層代碼、數(shù)據(jù)庫(kù)代碼以及其他程序元素。實(shí)現(xiàn)粘連在了一起,模型驅(qū)動(dòng)對(duì)象于是變得不再可行。也很難使用自動(dòng)化測(cè)試。對(duì)于每個(gè)活動(dòng)中涉及到的技術(shù)和邏輯,程序必須保持簡(jiǎn)單,否則就會(huì)變得很難理解。因此,將一個(gè)復(fù)雜的程序切分成層。開(kāi)發(fā)每一個(gè)層中內(nèi)聚的設(shè)計(jì),讓每個(gè)層僅依賴于它底下的那層。遵照標(biāo)準(zhǔn)的架構(gòu)模式以提供層的低耦合。將領(lǐng)域模型相關(guān)的代碼集中到一個(gè)層中,把它從用戶界面、應(yīng)用和基礎(chǔ)設(shè)施代碼中分隔開(kāi)來(lái)。釋放領(lǐng)域?qū)ο蟮娘@示自己、保存自己、管理應(yīng)用任務(wù)等職責(zé),讓它專注于展現(xiàn)領(lǐng)域模型。這會(huì)讓一個(gè)模型進(jìn)一步富含知識(shí),更清晰地捕獲基礎(chǔ)的業(yè)務(wù)知識(shí),讓它們正常工作。 ?   一個(gè)通用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的架構(gòu)性解決方案包含4 個(gè)概念層: ?   將應(yīng)用劃分成分離的層并建立層間的交換規(guī)則很重要。如果代碼沒(méi)有被清晰隔離到某層中,它會(huì)迅即混亂,因?yàn)樗兊梅浅ky以管理變更。在某處對(duì)代碼的一個(gè)簡(jiǎn)單修改會(huì)對(duì)其他地方的代碼造成不可估量的結(jié)果。領(lǐng)域?qū)討?yīng)該關(guān)注核心的領(lǐng)域問(wèn)題。它應(yīng)該不涉及基礎(chǔ)設(shè)施類的活動(dòng)。用戶界面既不跟業(yè)務(wù)邏輯緊密捆綁也不包含通常屬于基礎(chǔ)設(shè)施層的任務(wù)。在很多情況下應(yīng)用層是必要的。它會(huì)成為業(yè)務(wù)邏輯之上的管理者,用來(lái)監(jiān)督和協(xié)調(diào)應(yīng)用的整個(gè)活動(dòng)。 ?   例如,對(duì)一個(gè)典型的交互型應(yīng)用,領(lǐng)域和基礎(chǔ)設(shè)施層看上去會(huì)這樣:用戶希望預(yù)定一個(gè)飛行路線,要求用一個(gè)應(yīng)用層中的應(yīng)用服務(wù)來(lái)完成。應(yīng)用依次從基礎(chǔ)設(shè)施中取得相關(guān)的領(lǐng)域?qū)ο?#xff0c;調(diào)用它們的相關(guān)方法,比如檢查與另一個(gè)已經(jīng)被預(yù)定的飛行線路的安全邊界。當(dāng)領(lǐng)域?qū)ο髨?zhí)行完所有的檢查并修改了它們的狀態(tài)決定后,應(yīng)用服 務(wù)將對(duì)象持久化到基礎(chǔ)設(shè)施中。? ?   實(shí)體   有一類對(duì)象看上去好像擁有標(biāo)識(shí)符,它的標(biāo)識(shí)符在歷經(jīng)軟件的各種狀態(tài)后仍能保持一致。對(duì)這些對(duì)象來(lái)講這已經(jīng)不再是它們關(guān)心的屬性,這意味著能夠跨越系統(tǒng)的生命周期甚至能超越軟件系統(tǒng)的一系列的延續(xù)性和標(biāo)識(shí)符。我們把這樣的對(duì)象稱為實(shí)體。 ?   OOP 語(yǔ)言會(huì)把對(duì)象的實(shí)例放于內(nèi)存,它們對(duì)每個(gè)對(duì)象會(huì)保持一個(gè)對(duì)像引用或者是記錄一個(gè)對(duì)象地址。在給定的某個(gè)時(shí)刻,這種引用對(duì)每一個(gè)對(duì)象而言是唯一的,但是很難保證在不確定的某個(gè)時(shí)間段它也是如此。實(shí)際上恰恰相反。對(duì)象經(jīng)常被移出或者移回內(nèi)存,它被序列化后在網(wǎng)絡(luò)上傳輸,然后在另一端被重新建立,或者它們都被消除。在程序的運(yùn)行環(huán)境中,那個(gè)看起來(lái)像標(biāo)識(shí)符的引用關(guān)系其實(shí)并不是我們?cè)谡務(wù)摰臉?biāo)識(shí)符。 ?   如果有一個(gè)存放了天氣信息(如溫度)的類,很容易產(chǎn)生同一個(gè)類的不同實(shí)例,這兩個(gè)實(shí)例都包含了同樣的值,這兩個(gè)對(duì)象是完全相當(dāng)?shù)?#xff0c;可以用其中一個(gè)跟另一個(gè)交換,但它們擁有不同的引用,它們不是實(shí)體。如果我們要用軟件程序?qū)崿F(xiàn)一個(gè)“人”的概念,我們可能會(huì)創(chuàng)建一個(gè)Person 類,這個(gè)類會(huì)帶有一系列的屬性,如:名稱,出生日期,出生地等。這些屬性中有哪個(gè)可以作為Person 的標(biāo)識(shí)符嗎?名字不可以作為標(biāo)識(shí)符,因?yàn)榭赡苡泻芏嗳藫碛型粋€(gè)名字。如果我們只 考慮兩個(gè)人的名字的話,我們不能使用同一個(gè)名字來(lái)區(qū)分他們兩個(gè)。我們也不能使用出生日期作為標(biāo)識(shí)符,因?yàn)闀?huì)有很多人出在同一天出生。同樣也不能用出生地作為標(biāo)識(shí)符。一個(gè)對(duì)象必須與其他的對(duì)象區(qū)分開(kāi)來(lái),即使是它們擁有著相同的屬性。錯(cuò)誤的標(biāo)識(shí)符可能會(huì)導(dǎo)致數(shù)據(jù)混亂。 ?   考慮一下一個(gè)銀行會(huì)計(jì)系統(tǒng)。每一個(gè)賬戶擁有它自己的數(shù)字碼。每一個(gè)賬戶可以用它的數(shù)字碼來(lái)精確標(biāo)識(shí)。這個(gè)數(shù)字碼在系統(tǒng)的生命周期中會(huì)保持不變,并保證延續(xù)性。賬戶碼可以作為一個(gè)對(duì)象存在于內(nèi)存中,也可以被在內(nèi)存中銷(xiāo)毀,發(fā)送到數(shù)據(jù)庫(kù)中。當(dāng)這個(gè)賬戶被關(guān)閉時(shí),它還可以被歸檔,只要還有人對(duì)它感興趣,它就依然在某處存在。不論它的表現(xiàn)形式如何,數(shù)字碼會(huì)保持一致。因此,在軟件中實(shí)現(xiàn)實(shí)體意味著創(chuàng)建標(biāo)識(shí)符。對(duì)一個(gè)人而言,其標(biāo)識(shí)符可能是屬性的組合:名稱,出生日期,出生地,父母名稱、當(dāng)前地址。在美國(guó),社會(huì)保險(xiǎn)號(hào)也會(huì)用來(lái)創(chuàng)建標(biāo)識(shí)符。對(duì)一個(gè)銀行賬戶來(lái)說(shuō),賬號(hào)看上去已經(jīng)足可以作為標(biāo)識(shí)符了。通常標(biāo)識(shí)符或是對(duì) 象的一個(gè)屬性(或?qū)傩缘慕M合),一個(gè)專門(mén)為保存和表現(xiàn)標(biāo)識(shí)符而創(chuàng)建的屬性,也或是一種行為。對(duì)兩個(gè)擁有不同標(biāo)識(shí)符的對(duì)象來(lái)說(shuō),能用系統(tǒng)輕易地把它們區(qū)分開(kāi)來(lái),或者兩個(gè)使用了相同標(biāo)識(shí)符對(duì)象能被系統(tǒng)看成是相同的,這些都是非常重要的。如果不能滿足這個(gè)條件,整個(gè)系統(tǒng)可能是有問(wèn)題的。 ?   有很多不同的方式來(lái)為每一個(gè)對(duì)象創(chuàng)建一個(gè)唯一的標(biāo)識(shí)符:可能由一個(gè)模型來(lái)自動(dòng)產(chǎn)生ID,在軟件中內(nèi)部使用,不會(huì)讓它對(duì)用戶可見(jiàn);它可能是數(shù)據(jù)庫(kù)表的一個(gè)主鍵,會(huì)被保證在數(shù)據(jù)庫(kù)中是唯一的。只要對(duì)象從數(shù)據(jù)庫(kù)中被檢索,它的ID 就會(huì)被檢索出并在內(nèi)存中被重建;ID 也可能由用戶創(chuàng)建,例如每個(gè)機(jī)場(chǎng)會(huì)有一個(gè)關(guān)聯(lián)的代 碼。每個(gè)機(jī)場(chǎng)擁有一個(gè)唯一的字符串ID,這個(gè)字符串是在世界范圍內(nèi)通用的,被世界上的每一個(gè)旅行代理使用以標(biāo)識(shí)它們的旅行計(jì)劃中涉及的機(jī)場(chǎng)。另一種解決方案是使用對(duì)象的屬性來(lái)創(chuàng)建標(biāo)識(shí)符,當(dāng)這個(gè)屬性不足以代表標(biāo)識(shí)符時(shí),另一個(gè)屬性就會(huì)被加入以幫助確定每一個(gè)對(duì)象。 ?   當(dāng)一個(gè)對(duì)象可以用其標(biāo)識(shí)符而不是它的屬性來(lái)區(qū)分時(shí),可以將它作為模型中的主要定義。保證類定義簡(jiǎn)潔并關(guān)注生命周期的延續(xù)性和可標(biāo)識(shí)性。對(duì)每個(gè)對(duì)象定義一個(gè)有意義的區(qū)分,而不管它的形式或者歷史。警惕要求使用屬性匹配對(duì)象的需求。定義一個(gè)可以保證對(duì)每一個(gè)對(duì)象產(chǎn)生一個(gè)唯一的結(jié)果的操作,這個(gè)過(guò)程可能需要某個(gè)符號(hào)以保證唯一性。這意味著標(biāo)識(shí)可以來(lái)自外部,或者它可以是由系統(tǒng)產(chǎn)生、使用任意的標(biāo)識(shí)符,但它必須符合模型中的身份差別。模型必須定義哪些被看作同一事物。   實(shí)體是領(lǐng)域模型中非常重要的對(duì)象,并且它們應(yīng)該在建模過(guò)程開(kāi)始時(shí)就被考慮。決定一個(gè)對(duì)象是否需要成為一個(gè)實(shí)體也很重要,這會(huì)在下一個(gè)模型中被討論。   ?   由于篇幅的原因,這里也不過(guò)多的寫(xiě)了,大家可以先下載DDD的精簡(jiǎn)版看看,需要的話,留下Email,我給出DDD的完整版!   今天就到這里了,還是希望多多見(jiàn)諒,支持!謝謝啊! ?著作權(quán)歸作者所有:來(lái)自51CTO博客作者yanyangtian的原創(chuàng)作品,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任 分層 業(yè)務(wù)層 小洋 走向.NET架構(gòu)設(shè)計(jì)

0

微博 QQ 微信

收藏

上一篇:走向.NET架構(gòu)設(shè)計(jì)—第四章—業(yè)... 下一篇:走向.NET架構(gòu)設(shè)計(jì)—第五章—業(yè)... yanyangtian

99篇文章,106W+人氣,13粉絲

關(guān)注

總結(jié)

以上是生活随笔為你收集整理的走向.NET架构设计—第四章—业务层分层架构(后篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。