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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

走向.NET架构设计—第三章—分层设计,初涉架构

發(fā)布時(shí)間:2025/5/22 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 走向.NET架构设计—第三章—分层设计,初涉架构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
走向.NET架構(gòu)設(shè)計(jì)分層設(shè)計(jì),初涉架構(gòu)(前篇)   前言:本篇不打算接著上一篇來,這沒有關(guān)系,以為內(nèi)他們之間的聯(lián)系不大,以后我再補(bǔ)上。因?yàn)橹耙恢痹谡務(wù)撛O(shè)計(jì),也談了一些TDD的東西,大家反應(yīng)覺得講述的還是有點(diǎn),所以打算換一種方式:先講述一些例子,把一些思想穿插著講述,理論的東西最后最為總結(jié)。希望大家支持! 本篇主要講述ASP.NET應(yīng)用中如何進(jìn)行邏輯分層。本篇的前篇會(huì)從Smart UI 反模式和它的一些缺點(diǎn)開始講述,然后一步步的講述如何邏輯分層,而且在后篇中也會(huì)給出一個(gè)ASP.NET設(shè)計(jì)中常用的僅供參考的分層架構(gòu)的Demo ?? 一個(gè)穩(wěn)定和易維護(hù)的系統(tǒng)必須建立在一個(gè)好的基礎(chǔ)之上。計(jì)劃和設(shè)計(jì)一個(gè)好的架構(gòu)對(duì)一個(gè)項(xiàng)目的成敗起著至關(guān)重要的作用。可能在我們一般做項(xiàng)目的時(shí)候,經(jīng)驗(yàn)告訴我們:3層,N層的設(shè)計(jì),基本就能把問題解決了,很多的情況確實(shí)是這樣的。在提出一個(gè)設(shè)計(jì)的時(shí)候,常常要考慮為什么要這樣劃分結(jié)構(gòu),而且常常要承擔(dān)風(fēng)險(xiǎn)和責(zé)任,特別是萬一這個(gè)項(xiàng)目因?yàn)樽畛醯脑O(shè)計(jì)而導(dǎo)致崩潰,那就郁悶了。所以設(shè)計(jì)的提出一定和考慮業(yè)務(wù)。 ?   下面就先來看看Smart UI的設(shè)計(jì)方式。   Smart UI 想想我們最初是如何開發(fā)ASP.NET的應(yīng)用的:在頁(yè)面設(shè)計(jì)界面中把界面布局好,然后雙擊控件就開始編寫功能代碼。很多的時(shí)候把邏輯判斷和數(shù)據(jù)訪問都寫在頁(yè)面的.cs的文件中。后來我們學(xué)習(xí)到了分層,逐漸的明白了這種方式的缺點(diǎn):導(dǎo)致業(yè)務(wù)邏輯代碼到處分散而且重復(fù),不利于以后的更改和維護(hù)等。 ? 盡管有上述說的一些缺點(diǎn),Smart UI還是有它的用途的,如為項(xiàng)目快速的建立一個(gè)原型或者開發(fā)一個(gè)功能比較的小的項(xiàng)目。還有一個(gè)問題,如何最初用Smart UI的方式開發(fā)的小項(xiàng)目很成功,慢慢的變大,變復(fù)雜了,那么很多的問題就出來了。就像Flower在架構(gòu)模式一書中提到的:盡量用領(lǐng)域模型來組織一個(gè)項(xiàng)目的業(yè)務(wù)邏輯,盡管在開始的時(shí)候邏輯不復(fù)雜或者看不出這種方式的好處,一旦項(xiàng)目變化,好處就顯而易見了。在對(duì)項(xiàng)目原型開發(fā)中,盡量不用Smart UI ? 其實(shí)Smart UI最大的問題就是:職責(zé)不清把所有的東西全部寫在一起。 為了和以后講述的內(nèi)容的比較,我還是寫一個(gè)例子出來,很多朋友都已經(jīng)對(duì)這種Smart UI的開發(fā)方式很熟悉了,可以跳過下面的例子。? ? 這里以產(chǎn)品管理系統(tǒng)中的一個(gè)簡(jiǎn)單場(chǎng)景為例:顯示所有的產(chǎn)品信息。例子采用ASP.NET來實(shí)現(xiàn),步驟如下: ???? 1.創(chuàng)建AgileSharp.Chapter3.AntipatternASP.NET項(xiàng)目,如圖 所示: ? ?????2.? 選擇App_Data文件夾,添加數(shù)據(jù)庫(kù)OrderManagement.mdf,如圖 所示 ? ? ? ? 3.?在新加的數(shù)據(jù)庫(kù)文件上右擊,并且打開。然后添加一個(gè)新表:如下: ? ? 其中ProductId設(shè)置為自動(dòng)標(biāo)示。 然后保存為Products表。 ? 4.?添加一些測(cè)試的數(shù)據(jù).? ???? 5.?然后選擇Products表,并且把表拖放到Default.aspx頁(yè)面上。這樣之后,在頁(yè)面上就自動(dòng)添加一個(gè)GridViewSqlDataSource. ? 界面就如下圖: ? 6.?我我們添加額外的兩列來顯示折扣信息和庫(kù)存信息。 ? 7.?然后,我們?cè)?/span>Default.aspx.cs后編碼: ? protected?void?gvProduct_RowDataBound(object?sender,GridViewRowEventArgs?e)
{
????if?(e.Row.RowType?==?DataControlRowType.DataRow)
????????{
????????intproductId?=?int.Parse(((System.Data.DataRowView)e.Row.DataItem)
????????[“ProductId”].ToString());

????????decimal?price?=?decimal.Parse(((System.Data.DataRowView)e.Row.DataItem)
????????????[“Price”].ToString());

????????????Label?lblDiscount?=?(Label)e.Row.FindControl(“l(fā)blDiscount”);

????????lblDiscount.Text?=?DisplayDiscount
????(ApplyDiscountsStrategy(productId,?price));

???????}
}
復(fù)制代碼 ???????? 在上面的 GridView1_RowDataBound方法在GridView的每個(gè)row被創(chuàng)建的時(shí)候調(diào)用。這個(gè)方法獲取每個(gè)產(chǎn)品的推薦的零售價(jià)格RRP(Recommend Retail Price),然后調(diào)用 DisplayDiscountDisplaySavings方法來獲取折扣和庫(kù)存,然后再更新UI的顯示。 ???????? 在上面的代碼中,就將計(jì)算折扣和計(jì)算庫(kù)存的邏輯寫在了UI中,而且數(shù)據(jù)的訪問代碼也寫在UI中了。這就意味著:如果我們想要在不同的頁(yè)面顯示產(chǎn)品的信息,那么這些邏輯就得一遍遍的重寫。如果我們?cè)诩右恍┬碌墓δ?#xff0c;那么頁(yè)面后面的代碼就開始修改,開始縫縫補(bǔ)補(bǔ)。 ?   解決Smart UI的方法就是劃分職責(zé),我想大家都知道“單一職責(zé)的原則”,這個(gè)原則不僅僅適用于類,方法,而且對(duì)項(xiàng)目的層次劃分也有作用。分層,最主要的目的就是:把不通的功能放在各自對(duì)應(yīng)的地方,這樣清晰的職責(zé)劃分,也是對(duì)變化點(diǎn)進(jìn)行分離。   下面的圖就是一個(gè)典型的企業(yè)級(jí)ASP.NET項(xiàng)目的分層結(jié)構(gòu): ?   下面我們就來看看,按照我們的一般的分層的經(jīng)驗(yàn)來如何設(shè)計(jì)這功能: ?????下面,我們?cè)俅蝸砭毾率?#xff0c;重新設(shè)計(jì)前面提到的訂單管理系統(tǒng),使其功能適應(yīng)新的需求(很多時(shí)候,重新設(shè)計(jì)基本不可能的,所以在開始設(shè)計(jì)時(shí)就需要考慮清楚,這里重新設(shè)計(jì)只是從舉例的角度來考慮的): (1) 支持用戶通過網(wǎng)頁(yè)或PC桌面程序來訪問系統(tǒng)。 (2) 訂單管理系統(tǒng)需要為其他的系統(tǒng)(如財(cái)務(wù)系統(tǒng)等)提供服務(wù)。 (3) 訂單的一些處理流程和相關(guān)的業(yè)務(wù)處理在其他的系統(tǒng)要用到。 (4) 還有更多的需求,等待確認(rèn)。 ?   注:朋友們一眼就應(yīng)該可以看出,這些類庫(kù)的命名是反映了一些DDD的一些概念,但是,不是說在一個(gè)項(xiàng)目的開發(fā)中用了這些概念名詞就表明就開發(fā)的方式是DDD了。 ?   這里我先提一下上面類庫(kù)的一起名字:盡管有關(guān)DDD和一些架構(gòu)模式的概念我在以后的文章中會(huì)講,但我這里還是先給大家提一下,目的僅僅是讓大家對(duì)這個(gè)例子有一些更好的了解。   在DDD中,一直主張業(yè)務(wù)模型,也就是我們常常所說的業(yè)務(wù)類,例如之前例子中的Product,只關(guān)注自身的業(yè)務(wù)邏輯,而不管如何去獲取和保存數(shù)據(jù),這些對(duì)數(shù)據(jù)的操作完全交給另外的對(duì)象去執(zhí)行,也就是Repository,這樣就達(dá)到了DDD中所說的PIPersistence Ignore)。所以在上面的例子中,ASPPatterns.Chap3.Layered.Model就代表了一個(gè)業(yè)務(wù)模型,它之所以被Repository引用,是因?yàn)?/span>Repository負(fù)責(zé)將Model的數(shù)據(jù)持久化到存儲(chǔ)設(shè)備中,而Model不管這些事情了。 ?   在講之前,首先給大家統(tǒng)一 一下Service的概念。?   有時(shí)在類的設(shè)計(jì)過程中,有些行為不適合放在任何的一個(gè)類中,如果把這些行為放在一個(gè)不真正擁有它的類中,只能把類的職責(zé)搞混了。為了給這些行為一個(gè)安置的地方,我們常常把這些行為放在一個(gè)稱為服務(wù)的類中。 ?   作為服務(wù)的類一般沒有狀態(tài)的,可以簡(jiǎn)單的作為一個(gè)提供操作接口實(shí)現(xiàn)。   在DDD中,Service也是用來提供一種服務(wù)的。很多人看到了DDD的類層次結(jié)構(gòu)是這樣的:Repository---Model---Service--- Presentation(包括本例),所以都以為Service只能出現(xiàn)在Model的上一層,如果看到Repository-- Service ---Model---Service--- Presentation這樣的層次結(jié)構(gòu),又作何感想。如果被這些所謂的結(jié)構(gòu)搞迷惑了,那就說明對(duì)DDD的理解只是在于“形”上。Service就是向外部提供的功能接口,和我們常見的Web Service的概念很相似,例如的Web Service就是向外部系統(tǒng)提供一些功能的。   我們來看下面的一個(gè)圖: ? ? ?   有時(shí)候之所以要在Model層之上加上一個(gè)Service層,主要的原因就是實(shí)現(xiàn)粗顆粒度的API,往往和系統(tǒng)的User Case有一定的聯(lián)系。例如,如果在系統(tǒng)用例中要實(shí)現(xiàn)一個(gè)用戶訂單的處理,那么可能就涉及到Customer, Product,Order等類,當(dāng)然,如果我們調(diào)用這些類來共同完成這個(gè)任務(wù)是沒問題的,但是這樣就向調(diào)用者暴露這些類之間的復(fù)雜的關(guān)系,而且如果處理的過程變化了,那么調(diào)用者的代碼就要改變,如果把這個(gè)處理的方法放在上面的任意一個(gè)類中,又顯得不倫不類,這里的Service功能就類似于設(shè)計(jì)模式中的Fa?ade外觀模式。這樣就向外界提供簡(jiǎn)單的API,向外界提供訂單處理的服務(wù)! ?   所以在一般在DDD中業(yè)務(wù)層被劃分為兩個(gè)邏輯層:Model (提供細(xì)粒度的業(yè)務(wù)邏輯處理,也便于重用), Service(提供業(yè)務(wù)處理的流程,提供粗顆粒度的供外部調(diào)用的方法)。 ?   但是,我們常見到的Model層之上的Service層僅僅只是對(duì)CRUD的再次封裝,一個(gè)可能的原因就是業(yè)務(wù)不是很復(fù)雜,這時(shí)其實(shí)這個(gè)Service層可以拿掉的,但是考慮到以后可能邏輯會(huì)更多更復(fù)雜,所以還是保留Service這層。 ?   其實(shí)在Repository上的那個(gè)Service也是同樣的概念。例如發(fā)送郵件通知用戶的功能。例如上圖中的最上層的Service可以調(diào)用業(yè)務(wù)層和基礎(chǔ)設(shè)施層的Service來共同完成一個(gè)事情。 ?   今天的上篇的就講述到這里吧,下篇會(huì)用一個(gè)例子,代碼量還是有點(diǎn)的!敬請(qǐng)關(guān)注!   大家感興趣,我們下篇講述!

總結(jié)

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

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

主站蜘蛛池模板: 天堂成人在线 | 中国黄色小视频 | 91亚洲国产 | 日本色图片 | 国产日韩一区二区在线观看 | 色屁屁影院www国产高清麻豆 | 老熟妇一区二区三区啪啪 | 激情欧美一区 | 亚洲天堂一区在线 | 久久久久中文字幕亚洲精品 | 天天躁日日躁狠狠躁av麻豆 | 色网导航站 | 欧美精品福利视频 | 中文字幕高清在线免费播放 | 国产精品人人妻人人爽人人牛 | 国产精品1 | 少妇av一区二区三区 | 2017狠狠干 | 欧美日韩国产在线播放 | 天堂视频在线 | 老汉av网站 | 精品99久久久 | 一区二区在线视频观看 | 亚洲情趣 | 久久99久久98精品免观看软件 | 一区二区三区四区在线观看视频 | 欧美a v在线播放 | 久久久久久国产精品三级玉女聊斋 | 名校风暴在线观看免费高清完整 | 一区二区三区91 | 国产1区2区| 乱熟女高潮一区二区在线 | 欧美aa级 | 中国免费一级片 | 关秀媚三级 | 久久久成人精品一区二区三区 | 午夜电影你懂的 | 女子spa高潮呻吟抽搐 | 中国美女洗澡免费看网站 | 欧美天天干 | 秋霞福利网 | 午夜在线影院 | 成人av手机在线 | 麻豆成人在线观看 | 一级特黄aaa | 国产一级二级三级在线观看 | 小蝌蚪视频色 | 男男av网站| 欧美大肥婆大肥bbbbb | 亚洲第一欧美 | 中文字幕av不卡 | 国产一区二区三区四区 | 欧美亚洲综合视频 | 91社区视频 | 精品无码国产一区二区三区av | 黄色精品一区二区 | 这里精品 | 中文字幕亚洲高清 | 欧美在线 | 亚洲 | 色吧av| 亚洲乱视频 | 午夜久久影院 | 三级做爰在线观看视频 | 欧美 日韩 国产 高清 | 美女100%无挡 | 不卡视频在线播放 | 涩涩视频在线播放 | 成人性做爰aaa片免费看不忠 | 在线免费观看av网址 | 成年人在线免费观看视频网站 | 亚洲人在线观看视频 | 久久天天躁狠狠躁夜夜av | 产乳奶汁h文1v1 | 欧美在线视频网 | 丁香九月婷婷 | 亚洲精品影片 | 亚洲一卡二卡三卡 | 欧类av怡春院 | 毛片网站免费观看 | 久久久久国产精品国产 | 一本大道av伊人久久综合 | 99re超碰 | 亚洲色欲色欲www在线观看 | 男人的天堂亚洲 | 四虎免费在线观看 | 色综合久久久久久久 | 深夜福利视频导航 | 亚洲a级片 | 国产精品久久久久毛片大屁完整版 | 欧美交| 精品影视一区二区 | 国产在线精品播放 | 成人资源在线观看 | 三年中文在线观看中文版 | 国产最新精品视频 | 欧美日韩天堂 | 黑人vs日本人ⅹxxxhd | 先锋影音一区二区三区 | 有码中文字幕 |