這兩天比較忙,周末也在加班,所以更新的就慢了一點(diǎn),不過(guò)沒關(guān)系,今天我們就進(jìn)行千呼萬(wàn)喚的系統(tǒng)開發(fā)框架的設(shè)計(jì)。不知道上篇關(guān)于架構(gòu)設(shè)計(jì)的文章大家有沒有閱讀,如果閱讀后相信一定對(duì)架構(gòu)設(shè)計(jì)有了更近一部的理解,如果你沒有閱讀也希望大家能好好閱讀一下!其實(shí)說(shuō)白了,架構(gòu)是為了應(yīng)對(duì)軟件系統(tǒng)復(fù)雜度而提出的一個(gè)解決方案,架構(gòu)設(shè)計(jì)的最終目的也就是為了讓復(fù)雜的問(wèn)題簡(jiǎn)單化!今天我們就結(jié)合架構(gòu)設(shè)計(jì)的思想來(lái)進(jìn)行我們的CMS實(shí)戰(zhàn)項(xiàng)目的架構(gòu)設(shè)計(jì),接著再設(shè)計(jì)下開發(fā)框架吧。如果你有其他看法或者見解歡迎加入我們的實(shí)戰(zhàn)項(xiàng)目交流群637326624 跟大伙共同交流!
本文已收錄至《.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃》
作者:依樂祝
寫在前面
仔細(xì)想想我們的這個(gè)極簡(jiǎn)CMS系統(tǒng),可以說(shuō)很簡(jiǎn)單,簡(jiǎn)單到都無(wú)須進(jìn)行特殊的架構(gòu)設(shè)計(jì),只需按照你所熟悉的編碼方式直接進(jìn)行快速的編碼實(shí)現(xiàn)即可,如果做得好的話,訪問(wèn)量上來(lái)了你再加一個(gè)緩存處理完全能夠支撐一定的并發(fā)!如下圖所示:我們前期先進(jìn)行單體架構(gòu)的實(shí)現(xiàn),等后期分布式系列實(shí)戰(zhàn)課程的時(shí)候再講解如何進(jìn)行分布式微服務(wù)架構(gòu)的實(shí)現(xiàn)。

看到?jīng)]有,標(biāo)準(zhǔn)的單體架構(gòu),只是在數(shù)據(jù)庫(kù)層之前加了一個(gè)緩存的設(shè)計(jì)來(lái)應(yīng)對(duì)一些并發(fā)的情況!既然架構(gòu)設(shè)計(jì)確定了,那么我們就進(jìn)行開發(fā)框架的搭建吧!如果架構(gòu)的復(fù)雜點(diǎn)的話,可能涉及到數(shù)據(jù)庫(kù)集群,站點(diǎn)集群及負(fù)載均衡,可是我們完全沒必要那樣玩!一個(gè)階段設(shè)計(jì)一個(gè)階段的架構(gòu),要知道天貓也不是剛開始就架構(gòu)的這么完善支持這么高的并發(fā)的!而是經(jīng)過(guò)這么多次雙十一的考驗(yàn)之后慢慢完成到今天這個(gè)能夠支持每秒這么次并發(fā)的!說(shuō)白了,架構(gòu)是一個(gè)演變的過(guò)程,而并非設(shè)計(jì)的越復(fù)雜,越完善就表示架構(gòu)設(shè)計(jì)的就越好的(有點(diǎn)拗口,自己理解下),而要結(jié)合實(shí)際,讓需求來(lái)驅(qū)動(dòng)架構(gòu)。在分析設(shè)計(jì)階段,需要考慮一定的人力與時(shí)間去"跳出代碼,總攬全局",為業(yè)務(wù)和IT技術(shù)之間搭建一座"橋梁"。
CMS系統(tǒng)開發(fā)框架
話不多數(shù),先看下我的項(xiàng)目結(jié)構(gòu)截圖吧!

本來(lái)想進(jìn)行很復(fù)雜的框架的實(shí)現(xiàn)的,仿照DDD的思想進(jìn)行開發(fā)框架的搭建,后來(lái)想想何必呢,這么簡(jiǎn)單的系統(tǒng)搞得那么復(fù)雜,嚴(yán)重影響開發(fā)效率,反而得不償失。后來(lái)經(jīng)過(guò)深思熟慮后精簡(jiǎn)精簡(jiǎn)再精簡(jiǎn),斟酌斟酌再斟酌后就有了上面這樣的項(xiàng)目結(jié)構(gòu)。乍一看10個(gè)項(xiàng)目,是不是嚇得馬上就要關(guān)閉網(wǎng)頁(yè)了呢?下面我會(huì)給你詳細(xì)講解每一個(gè)項(xiàng)目的作用以及所要實(shí)現(xiàn)的功能。
其實(shí)明眼人一看這個(gè)結(jié)構(gòu)就已經(jīng)知道了每個(gè)模塊所要實(shí)現(xiàn)的功能了,這樣的分層設(shè)計(jì)可謂簡(jiǎn)單的都不需要我過(guò)多介紹,你都能明白每一個(gè)項(xiàng)目是用來(lái)干什么的(明白人也可以進(jìn)行項(xiàng)目的再度融合,甚至簡(jiǎn)單粗暴的合并到一個(gè)項(xiàng)目里面,不過(guò)本人更喜歡這種分層的設(shè)計(jì)感覺結(jié)構(gòu)更清晰)??墒俏疫@里還是要啰嗦兩句給你介紹下:
既然微軟已經(jīng)在前兩天將正式版的.NET Core SDK升級(jí)到了2.2的版本,那么我們的CMS系統(tǒng)就用.NET Core2.2進(jìn)行搭建吧!當(dāng)然,你在練習(xí)的時(shí)候也可以使用2.1進(jìn)行,沒有強(qiáng)制要求。
注意:ASP.NET Core2.2對(duì)VisualStudio有一定的要求必須是2017的高版本才能用。其目前的版本是15.8.4 總之盡量不要低于我這個(gè)版本,我正準(zhǔn)備升級(jí)呢!
-
UI
用戶UI層:這個(gè)就是我們CMS系統(tǒng)所要呈現(xiàn)的用戶界面,而我們得CMS系統(tǒng)又包含后臺(tái)管理模塊以及前臺(tái)網(wǎng)站模塊,因此這個(gè)解決方案文件夾下面有兩個(gè)ASP.NET Core網(wǎng)站項(xiàng)目,留個(gè)思考題給你吧,猜猜看哪個(gè)項(xiàng)目是后臺(tái)管理模塊,哪個(gè)項(xiàng)目是前臺(tái)網(wǎng)站模塊呢?把你的答案寫在留言區(qū)或者加群跟大伙討論下吧!
-
Application
應(yīng)用層:這個(gè)層提供對(duì)用戶界面的接口訪問(wèn),用戶界面層的兩個(gè)模塊如果想跟數(shù)據(jù)庫(kù)交互都需要通過(guò)這個(gè)層來(lái)進(jìn)行。這個(gè)應(yīng)用層起到用戶界面跟數(shù)據(jù)庫(kù)操作進(jìn)行解耦的作用。
-
Repositonry
倉(cāng)儲(chǔ)層:這個(gè)層主要就是跟數(shù)據(jù)庫(kù)的交互了,任何跟數(shù)據(jù)庫(kù)有關(guān)的操作都在這層來(lái)進(jìn)行實(shí)現(xiàn),看了上面的圖相信你已經(jīng)猜到了,前期我只是實(shí)現(xiàn)SqlServer的倉(cāng)儲(chǔ)實(shí)現(xiàn),至于其他數(shù)據(jù)庫(kù)的實(shí)現(xiàn)你只需要再建一個(gè)Czar.Cms.Repository.數(shù)據(jù)庫(kù)名 的倉(cāng)儲(chǔ)實(shí)現(xiàn)就可以了!這里我們也是采用依賴抽象而不依賴具體實(shí)現(xiàn)所以方便后期的擴(kuò)展。
-
Entity
實(shí)體對(duì)象層:這個(gè)層感覺有點(diǎn)多余,完全可以把這個(gè)界面融合到其他層,但是我并沒有這樣做,目的也是讓結(jié)構(gòu)更清晰,更容易理解。這里有兩個(gè)項(xiàng)目,相信一路看教程過(guò)來(lái)的朋友一定還記得我的第二篇文章《.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第二章 入門篇-快速入門ASP.NET Core看這篇就夠了 》中用的是ViewModel而不是直接用實(shí)體對(duì)象了!因?yàn)閷?shí)際引用中可能我們頁(yè)面中需要的數(shù)據(jù)跟我們數(shù)據(jù)庫(kù)中的數(shù)據(jù)并不完全一樣的,而且,有時(shí)候我們頁(yè)面中可能包含了更多地信息,這時(shí)候我們?cè)趺赐晥D中傳遞數(shù)據(jù)呢?這時(shí)候我們就有了ViewModel的概念。比方說(shuō):我們的有一個(gè)訂單詳細(xì)頁(yè)要同時(shí)顯示訂單的信息,以及訂單對(duì)應(yīng)的商品列表,這時(shí)候怎么辦呢?我們用一個(gè)ViewModel包含了訂單實(shí)體,并且包含了商品的列表就可以更方便的把數(shù)據(jù)傳遞到視圖里面了!
-
Infrastructure
基礎(chǔ)設(shè)施層:這個(gè)層也是我們代碼的核心層了,我們會(huì)在這里實(shí)現(xiàn)很多我們通用的方法,比方說(shuō)幫助類,對(duì)字符串String進(jìn)行一些擴(kuò)展,序列化與反序列化,HTTP請(qǐng)求,過(guò)濾器,日志功能,中間件的擴(kuò)展等等??傊@個(gè)里面包含了Czar.Cms的所有核心。
-
Test
測(cè)試層:這個(gè)層不用多說(shuō)了吧,就是對(duì)系統(tǒng)進(jìn)行測(cè)試的!里面包含單元測(cè)試以及集成測(cè)試!
相信通過(guò)我上面的介紹你一定會(huì)感覺到這個(gè)CMS系統(tǒng)的開發(fā)框架的層次非常清晰了吧!其實(shí)作為新手時(shí)期的我也是,看到項(xiàng)目太多的話就從心里面害怕,其實(shí)大伙大可不必,看到讓你害怕的事情就要勇敢的面對(duì)它,戰(zhàn)勝它,一定要跳出自己的舒適區(qū)。
GitHub與碼云上的項(xiàng)目開源地址
今天我們搭建的這個(gè)項(xiàng)目的結(jié)構(gòu)我已經(jīng)同步更新到Github以及碼云上了,有興趣的朋友可以下載查看!覺得不錯(cuò)的歡迎Star
GitHub:https://github.com/yilezhu/Czar.Cms
碼云:https://gitee.com/yilezhu/Czar.Cms
如果你覺得這個(gè)系列對(duì)您有所幫助的話,歡迎以各種方式進(jìn)行支持,最簡(jiǎn)單有效的就是博客園給個(gè)推薦,GitHub給個(gè)Star。同時(shí)今天我申請(qǐng)了一個(gè)DotNetCore實(shí)戰(zhàn)的訂閱號(hào),有興趣的朋友可以微信關(guān)注下:
[圖片上傳失敗...(image-21083b-1546775819057)]
總結(jié)
本文我首先帶著大家理解了一下架構(gòu)設(shè)計(jì)的目的,以及架構(gòu)設(shè)計(jì)的演變性。接著對(duì)我們這個(gè)ASP.NET Core的CMS實(shí)戰(zhàn)項(xiàng)目進(jìn)行了開發(fā)框架的設(shè)計(jì)。并對(duì)每個(gè)項(xiàng)目的所要實(shí)現(xiàn)的功能以及各自的職責(zé)進(jìn)行了相關(guān)的介紹!相信你已經(jīng)能夠清楚的明白了這個(gè)架構(gòu)的思想!到此,設(shè)計(jì)篇已經(jīng)結(jié)束,接下來(lái)就讓我們進(jìn)行真正的項(xiàng)目開發(fā)吧即開發(fā)篇的開始!