<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      應(yīng)用程序框架實(shí)戰(zhàn)三十八:項(xiàng)目示例VS解決方案的創(chuàng)建(一)

        進(jìn)行項(xiàng)目開發(fā)的第一步,是創(chuàng)建出適合自己團(tuán)隊(duì)習(xí)慣的VS解決方案,雖然我已經(jīng)提供了項(xiàng)目示例,但畢竟是我創(chuàng)建的,你直接使用可能并不合適,另外你如果嘗試模仿重新創(chuàng)建該示例,中間可能碰到各種障礙,特別是項(xiàng)目間的依賴關(guān)系。

        本文的目的是幫助.Net架構(gòu)初學(xué)者能順利搭建起適合自己的VS解決方案,我會(huì)在本文演示曾經(jīng)用過的幾種不同風(fēng)格的目錄結(jié)構(gòu),你可以根據(jù)自己的習(xí)慣選擇一種并自行修改。

        本系列假定你已經(jīng)熟悉如何創(chuàng)建.NET類庫等基礎(chǔ)知識(shí),并具有.Net開發(fā)經(jīng)驗(yàn),我不會(huì)詳細(xì)到每一個(gè)細(xì)節(jié)。如果你是.Net初學(xué)者,尚未開發(fā)過任何實(shí)際項(xiàng)目,對(duì)你的建議就是關(guān)閉本頁面,去買本書打好基礎(chǔ),需要提升時(shí)再來。

      影響VS解決方案結(jié)構(gòu)的因素

      分層

        VS解決方案的創(chuàng)建,與你采用的分層方式密切相關(guān),我在之前的文章已經(jīng)簡單介紹過單層架構(gòu)和三層架構(gòu),本文采用DDD分層架構(gòu)進(jìn)行演示,說明項(xiàng)目示例Applications.Managements是怎樣創(chuàng)建出來的,并且可以怎樣簡化。

        我們平時(shí)所說的分層,屬于邏輯分層,它按照一定的邏輯層次分離關(guān)注點(diǎn),以便更好的組織代碼結(jié)構(gòu),方便維護(hù)。

        物理分層,是將不同的代碼部署到不同的服務(wù)器,以提供更高性能和安全性,如果對(duì)邏輯分層和物理分層的關(guān)系感興趣,請(qǐng)參考《C#企業(yè)應(yīng)用開發(fā)藝術(shù)-CSLA.NET框架開發(fā)實(shí)戰(zhàn)》一書。

        對(duì)于邏輯分層,只要將代碼分離到不同區(qū)域即可,可以按照不同的抽象粒度來組織代碼,比如類級(jí)別、目錄級(jí)別、程序集級(jí)別。

        目前普遍采用的是程序集級(jí)別進(jìn)行分層,即不同層的代碼放到不同的程序集中。

        如果期望減少程序集,可以僅創(chuàng)建一個(gè)類庫,采用目錄級(jí)別的劃分方式,在一個(gè)類庫中創(chuàng)建不同層的文件夾,各目錄放置各層的代碼。

        類級(jí)別粒度將不同層的對(duì)象合并,通過方法的形式分離各層代碼。

        通過程序集方式分層有諸多好處,比如清晰度、復(fù)用性等,我將采用程序集方式進(jìn)行演示,建議你在項(xiàng)目上也盡量采用這種方式。

      功能模塊

        另一個(gè)影響VS解決方案創(chuàng)建的因素是功能模塊的劃分。

        對(duì)于一個(gè)業(yè)務(wù)系統(tǒng),我們不僅要分層,而且還要?jiǎng)澐止δ苣K,以便對(duì)較大的業(yè)務(wù)問題進(jìn)行分解,從而降低復(fù)雜度,同時(shí)在解決某個(gè)特定模塊的問題時(shí),減少其它模塊的干擾。

        對(duì)于領(lǐng)域?qū)樱夷壳暗姆绞绞菫槊恳粋€(gè)功能模塊創(chuàng)建一個(gè)類庫項(xiàng)目,這樣做的好處是更方便復(fù)用,另外當(dāng)我需要將這個(gè)功能模塊分離出去也會(huì)更容易。

        當(dāng)然,采用文件夾來分隔也同樣可行,這是兩種不同的風(fēng)格,我會(huì)向你演示如何設(shè)計(jì)可以更方便的切換。

      可復(fù)用能力

        對(duì)于一個(gè)稍大的項(xiàng)目,把特定業(yè)務(wù)模塊、通用業(yè)務(wù)模塊、通用技術(shù)類庫放在同一個(gè)VS解決方案中,VS解決方案上的項(xiàng)目可能會(huì)達(dá)到上百個(gè),編譯速度將非常緩慢,導(dǎo)致很多不必要的麻煩。

        我之前已經(jīng)多次提到,你可以把通用技術(shù)類和通用業(yè)務(wù)類從具體項(xiàng)目中分離出來,這樣可以供多個(gè)項(xiàng)目使用,每個(gè)項(xiàng)目擁有自己的VS解決方案,共享相同的應(yīng)用框架,這樣維護(hù)會(huì)更容易,編譯速度也更快。  

        對(duì)于Applications.Managements項(xiàng)目示例,通用技術(shù)類庫已經(jīng)抽取到Util解決方案中,Applications.Managements不包含通用性的純技術(shù)代碼。

        我不會(huì)為你演示通用業(yè)務(wù)類的分離,因?yàn)榇a示例太簡單。

      其它因素

        不同的應(yīng)用程序類型也會(huì)影響VS解決方案的創(chuàng)建,比如創(chuàng)建WPF智能客戶端應(yīng)用程序,需要將應(yīng)用層創(chuàng)建為WCF類庫,這樣可以將應(yīng)用服務(wù)直接開放出來供WPF調(diào)用。對(duì)于WPF+WCF的架構(gòu),我后續(xù)也會(huì)進(jìn)行介紹,如何通過IOC切換本地調(diào)用和遠(yuǎn)程調(diào)用,通過這個(gè)架構(gòu)可以在開發(fā)時(shí)期采用本地方式調(diào)用,提高開發(fā)效率,部署時(shí)切換到WCF遠(yuǎn)程代理。

        如果你采用了諸如SOA架構(gòu),需要切割子系統(tǒng)部署成服務(wù),可能需要?jiǎng)?chuàng)建更多類型的項(xiàng)目和多個(gè)VS解決方案,這些架構(gòu)也對(duì)VS解決方案的創(chuàng)建具有相當(dāng)影響。由于本人在SOA方面經(jīng)驗(yàn)尚淺,待后續(xù)有更多經(jīng)驗(yàn)再進(jìn)行分享。

      VS解決方案創(chuàng)建實(shí)戰(zhàn)

        下面的步驟演示了我創(chuàng)建VS解決方案的習(xí)慣,你不一定要按我的步驟,只要最終達(dá)到你的要求即可。

      創(chuàng)建表現(xiàn)層MVC項(xiàng)目

        打開VS解決方案,我使用的是VS 2013,自帶了MVC4。

        創(chuàng)建MVC4項(xiàng)目,項(xiàng)目名稱為Applications.Presentation.Managements,解決方案名稱為Applications.Managements,MVC項(xiàng)目模板選擇“基本”。

        先來討論頂級(jí)空間的命名,即這里的Applications,要點(diǎn)是盡量抽象。頂級(jí)空間名稱盡量不使用特定于項(xiàng)目或客戶的名稱,因?yàn)槟阕鱿乱粋€(gè)項(xiàng)目時(shí),需要大量更改命名空間。我采用Applications,代表抽象的應(yīng)用程序,任何項(xiàng)目都是應(yīng)用程序。你也可以采用公司的名稱,比如你們公司簡稱為abc,那么可以這樣Abc.Managements。

        Managements代表這是一個(gè)管理系統(tǒng)。Applications.Presentation.Managements說明它是管理系統(tǒng)的表現(xiàn)層,但為什么不用Applications.Managements.Presentation,后面介紹到領(lǐng)域?qū)訒r(shí)我會(huì)說明這樣做的原因。

        對(duì)于表現(xiàn)層來講,沒有其它層會(huì)調(diào)用它的API,所以我想保持表現(xiàn)層命名空間的簡短,我耍了一個(gè)小技巧,將表現(xiàn)層的命名空間改成了Presentation。

        右鍵單擊Applications.Presentation.Managements項(xiàng)目,選擇“屬性”,修改“默認(rèn)命名空間”為Presetation,如下圖所示。

        MVC創(chuàng)建完成后,會(huì)在根目錄留下一個(gè)packages文件夾,MVC項(xiàng)目也會(huì)添加packages.config配置,這玩意很有用,Nuget會(huì)幫你管理依賴的程序集及版本,當(dāng)別人運(yùn)行你的解決方案時(shí)缺少程序集,會(huì)自動(dòng)下載還原。但我更喜歡自己手工管理,在Applications.Managements根目錄創(chuàng)建Libraries文件夾,我會(huì)把packages中必須的幾個(gè)dll復(fù)制進(jìn)去,其它全部刪掉。

        當(dāng)然,修改表現(xiàn)層默認(rèn)命名空間和刪除packages屬于我的個(gè)人習(xí)慣,介紹這個(gè)是方便你看我的代碼,對(duì)于你自己的項(xiàng)目,完全沒必要這么麻煩。

        編譯通過,繼續(xù)下面的步驟,后面再返回到表現(xiàn)層。

      創(chuàng)建表現(xiàn)層擴(kuò)展項(xiàng)目

        在Applications.Managements解決方案上右鍵,“添加”->“新建項(xiàng)目”,創(chuàng)建一個(gè)類庫項(xiàng)目,名稱為Applications.Presentation.Managements.Extensions。

        這個(gè)項(xiàng)目用來為表現(xiàn)層提供一些支持,比如業(yè)務(wù)組件的封裝。

        將它的默認(rèn)命名空間改成Presentation,方便表現(xiàn)層的調(diào)用。

        下面來考慮類庫輸出的DLL目標(biāo)位置,默認(rèn)是在bin\Debug\,表示DLL將輸出到類庫項(xiàng)目的bin目錄下Debug文件夾中。由于我們后續(xù)會(huì)創(chuàng)建更多的程序集,如果對(duì)輸出位置不進(jìn)行統(tǒng)一,將導(dǎo)致每個(gè)輸出目錄都產(chǎn)生大量重復(fù)的DLL。

        右鍵單擊擴(kuò)展類庫,選擇屬性,找到“生成”選項(xiàng)卡的“輸出路徑“,修改為..\Release\,如下圖所示。

        下面為Applications.Presentation.Managements項(xiàng)目添加Applications.Presentation.Managements.Extensions擴(kuò)展項(xiàng)目的引用。

      編譯通過,繼續(xù)下面的步驟。 

      創(chuàng)建應(yīng)用層項(xiàng)目

        在Applications.Managements解決方案上創(chuàng)建類庫項(xiàng)目,名稱為Applications.Services,修改類庫輸出路徑為..\Release\。

        應(yīng)用層是為表現(xiàn)層提供服務(wù)的,所以表現(xiàn)層Applications.Presentation.Managements需要添加應(yīng)用層Applications.Services的引用。

        編譯通過,繼續(xù)下面的步驟。

      創(chuàng)建基礎(chǔ)設(shè)施層項(xiàng)目

        DDD分層架構(gòu)中沒有了數(shù)據(jù)訪問層的概念,被包含到基礎(chǔ)設(shè)施層中。

        基礎(chǔ)設(shè)施層是為其它各層服務(wù)的,按道理說,其它各層應(yīng)該包含對(duì)基礎(chǔ)設(shè)施層的引用。

        但是,為了讓領(lǐng)域?qū)幼兊酶儍簦话銜?huì)應(yīng)用依賴倒置原則,讓基礎(chǔ)設(shè)施層反過來依賴領(lǐng)域?qū)印?/span>

        一些初學(xué)者會(huì)產(chǎn)生疑惑,這樣不是造成循環(huán)引用的死循環(huán)了嗎?下面談下我的看法,不一定正確,僅供參考。

        在《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書中,對(duì)基礎(chǔ)設(shè)施層的描述為:基礎(chǔ)設(shè)施層為各層提供通用的技術(shù)能力

        可見基礎(chǔ)設(shè)施層是一個(gè)抽象概念,諸如層超類型、公共操作類的封裝、數(shù)據(jù)庫的持久化,發(fā)郵件,發(fā)短信等操作,都是基礎(chǔ)設(shè)施層的范疇。

        在我的代碼中,大量通用技術(shù),都被封裝到Util相關(guān)的程序集中,如果需要合并VS解決方案,那么所有的Util項(xiàng)目都是基礎(chǔ)設(shè)施層的一個(gè)組成部分。

        對(duì)于領(lǐng)域?qū)优c基礎(chǔ)設(shè)施層的引用關(guān)系,與基礎(chǔ)設(shè)施層中項(xiàng)目耦合性強(qiáng)弱有關(guān),一般規(guī)律是:

      1. 領(lǐng)域?qū)又灰没A(chǔ)設(shè)施層中低耦合的項(xiàng)目,比如領(lǐng)域?qū)涌梢砸肬til.Core、Util.Domains,這些項(xiàng)目只包含對(duì).NET本身類庫的引用,沒有外部依賴,也不需要任何配置,領(lǐng)域?qū)右蕾囘@些項(xiàng)目不會(huì)降低可復(fù)用性和可測(cè)試性等指標(biāo)。
      2. 與領(lǐng)域?qū)用芮邢嚓P(guān)的高耦合基礎(chǔ)設(shè)施層項(xiàng)目,應(yīng)用依賴倒置原則,先在領(lǐng)域?qū)佣x操作接口,由基礎(chǔ)設(shè)施層項(xiàng)目引用相關(guān)領(lǐng)域?qū)禹?xiàng)目,并實(shí)現(xiàn)該接口。比如倉儲(chǔ)代表聚合的集合,倉儲(chǔ)的實(shí)現(xiàn)依賴于特定數(shù)據(jù)訪問技術(shù),甚至包含SQL語句,所以具有很高的耦合,且與領(lǐng)域?qū)犹囟K密切相關(guān)。如果領(lǐng)域?qū)又苯右脭?shù)據(jù)訪問實(shí)現(xiàn)的程序集,將嚴(yán)重降低領(lǐng)域?qū)拥目蓮?fù)用性,且更難測(cè)試。
      3. 與領(lǐng)域?qū)雨P(guān)系不大的高耦合基礎(chǔ)設(shè)施層項(xiàng)目,應(yīng)用分離接口模式,將操作接口與具體實(shí)現(xiàn)分離到基礎(chǔ)設(shè)施層的不同項(xiàng)目中。比如工作單元的接口IApplicationUnitOfWork,它與領(lǐng)域?qū)踊緵]啥關(guān)系,如果你的領(lǐng)域?qū)又话粋€(gè)類庫項(xiàng)目,把IApplicationUnitOfWork放到領(lǐng)域?qū)禹?xiàng)目中也沒什么問題,我之前一直是這樣干的,但如果你的領(lǐng)域?qū)影鄠€(gè)項(xiàng)目,你應(yīng)該放到哪一個(gè)項(xiàng)目中?單獨(dú)創(chuàng)建一個(gè)基礎(chǔ)設(shè)施層項(xiàng)目來放置這些接口會(huì)好一些。

       

      (未完待續(xù)…

      代碼更新

      1. 更新了js中的一些Bug
      2. 由于項(xiàng)目上需要使用MYSQL,最近幾天摸索了EF操作MYSQL,遇到的一些障礙已解決,特將解決方案放出,供使用MYSQL的同學(xué)參考。

          a) MYSQL的樂觀離線鎖與SQL SERVER顯著不同,主要參考王剛的這篇:EF6 Code First 系列 (三):在MySql中使用和SqlServer一致的RowVersion并發(fā)控制。不過對(duì)于Sql Server,我還是使用IsRowVersion,畢竟這是大部分項(xiàng)目的主打。

          b) 通過一個(gè)簡單的Ioc配置,即可將Sql Server切換到MySql。

        c) MySql不支持Sql Server的schema,我使用.分隔MySql表名模擬schema,以保持與Sql Server的一致性風(fēng)格,這需要一點(diǎn)EF映射技巧。

        3. codesmith代碼生成模板已更新,調(diào)整了命名空間,并增加了對(duì)mysql特定配置的生成。

        4. 數(shù)據(jù)庫備份中提供了一個(gè)MYSQL建庫腳本。

      QQ群

        應(yīng)用程序框架交流QQ群1:386092459(已滿) 

        應(yīng)用程序框架交流QQ群2:376124781 

        EasyUi交流QQ群:157809322 

      源碼下載:(下載時(shí)順手推薦)

      框架源碼

      項(xiàng)目示例源碼

      數(shù)據(jù)庫備份

      Codesmith生成器模板

      備注

        本來準(zhǔn)備只用一篇來完成本文,不過太忙了,只有分幾次來寫,希望各位見諒,下次更新的時(shí)間會(huì)比較長。

      posted @ 2015-05-26 01:45  何鎮(zhèn)汐  閱讀(12082)  評(píng)論(72)    收藏  舉報(bào)
      主站蜘蛛池模板: 日韩精品毛片一区到三区| 免费午夜无码片在线观看影院 | 日韩乱码卡一卡2卡三卡四| 国产永久免费高清在线| 92国产精品午夜福利免费| 高清不卡一区二区三区| 久久人人97超碰精品| 99精品国产成人一区二区| 中文字幕乱码熟妇五十中出 | 国产性色的免费视频网站| 九台市| 欧美日韩国产亚洲沙发| 狠狠亚洲色一日本高清色| 豆国产97在线 | 亚洲| 国产亚洲精品黑人粗大精选| 一区二区三区鲁丝不卡| 欧美乱码伦视频免费| 夜色福利站WWW国产在线视频| 国产成人午夜精品影院| 平泉县| 国产午夜精品福利视频| 亚洲综合一区二区三区视频| 熟妇无码熟妇毛片| 国产成人高清亚洲综合| 曰韩高清砖码一二区视频| 久久久亚洲欧洲日产国码αv| 成人亚欧欧美激情在线观看| 黑森林福利视频导航| 欧洲精品免费一区二区三区| 一区二区三区四区激情视频| 成人免费乱码大片a毛片| 国产jjizz女人多水喷水| 国产国拍精品av在线观看| 亚洲高清乱码午夜电影网| 精品国产一区av天美传媒| 99热精品国产三级在线观看| 久99久热只有精品国产99| 亚洲avav天堂av在线网爱情| 亚洲一区二区三区蜜桃臀| 人妻久久久一区二区三区| 综合色天天久久|