這兩天比較忙,周末也在加班,所以更新的就慢了一點,不過沒關係,今天我們就進行千呼萬喚的系統開發框架的設計。不知道上篇關於架構設計的文章大家有沒有閱讀,如果閱讀後相信一定對架構設計有了更近一部的理解,如果你沒有閱讀也希望大家能好好閱讀一下!其實說白了,架構是為了應對軟體系統複雜度而提出的一個解決方案, ...
這兩天比較忙,周末也在加班,所以更新的就慢了一點,不過沒關係,今天我們就進行千呼萬喚的系統開發框架的設計。不知道上篇關於架構設計的文章大家有沒有閱讀,如果閱讀後相信一定對架構設計有了更近一部的理解,如果你沒有閱讀也希望大家能好好閱讀一下!其實說白了,架構是為了應對軟體系統複雜度而提出的一個解決方案,架構設計的最終目的也就是為了讓複雜的問題簡單化!今天我們就結合架構設計的思想來進行我們的CMS實戰項目的架構設計,接著再設計下開發框架吧。如果你有其他看法或者見解歡迎加入我們的實戰項目交流群637326624 跟大伙共同交流!
本文已收錄至《.NET Core實戰項目之CMS 第一章 入門篇-開篇及總體規劃》
作者:依樂祝
寫在前面
仔細想想我們的這個極簡CMS系統,可以說很簡單,簡單到都無須進行特殊的架構設計,只需按照你所熟悉的編碼方式直接進行快速的編碼實現即可,如果做得好的話,訪問量上來了你再加一個緩存處理完全能夠支撐一定的併發!如下圖所示:我們前期先進行單體架構的實現,等後期分散式系列實戰課程的時候再講解如何進行分散式微服務架構的實現。
看到沒有,標準的單體架構,只是在資料庫層之前加了一個緩存的設計來應對一些併發的情況!既然架構設計確定了,那麼我們就進行開發框架的搭建吧!如果架構的複雜點的話,可能涉及到資料庫集群,站點集群及負載均衡,可是我們完全沒必要那樣玩!一個階段設計一個階段的架構,要知道天貓也不是剛開始就架構的這麼完善支持這麼高的併發的!而是經過這麼多次雙十一的考驗之後慢慢完成到今天這個能夠支持每秒這麼次併發的!說白了,架構是一個演變的過程,而並非設計的越複雜,越完善就表示架構設計的就越好的(有點拗口,自己理解下),而要結合實際,讓需求來驅動架構。在分析設計階段,需要考慮一定的人力與時間去"跳出代碼,總攬全局",為業務和IT技術之間搭建一座"橋梁"。
CMS系統開發框架
話不多數,先看下我的項目結構截圖吧!
本來想進行很複雜的框架的實現的,仿照DDD的思想進行開發框架的搭建,後來想想何必呢,這麼簡單的系統搞得那麼複雜,嚴重影響開發效率,反而得不嘗試。後來經過深思熟慮後精簡精簡再精簡,斟酌斟酌再斟酌後就有了上面這樣的項目結構。乍一看10個項目,是不是嚇得馬上就要關閉網頁了呢?下麵我會給你詳細講解每一個項目的作用以及所要實現的功能。
其實明眼人一看這個結構就已經知道了每個模塊所要實現的功能了,這樣的分層設計可謂簡單的都不需要我過多介紹,你都能明白每一個項目是用來乾什麼的(明白人也可以進行項目的再度融合,甚至簡單粗暴的合併到一個項目裡面,不過本人更喜歡這種分層的設計感覺結構更清晰)。可是我這裡還是要啰嗦兩句給你介紹下:
既然微軟已經在前兩天將正式版的.NET Core SDK升級到了2.2的版本,那麼我們的CMS系統就用.NET Core2.2進行搭建吧!當然,你在練習的時候也可以使用2.1進行,沒有強制要求。
註意:ASP.NET Core2.2對VisualStudio有一定的要求必須是2017的高版本才能用。其目前的版本是15.8.4 總之儘量不要低於我這個版本,我正準備升級呢!
UI
用戶UI層:這個就是我們CMS系統所要呈現的用戶界面,而我們得CMS系統又包含後臺管理模塊以及前臺網站模塊,因此這個解決方案文件夾下麵有兩個ASP.NET Core網站項目,留個思考題給你吧,猜猜看哪個項目是後臺管理模塊,哪個項目是前臺網站模塊呢?把你的答案寫在留言區或者加群跟大伙討論下吧!
Application
應用層:這個層提供對用戶界面的介面訪問,用戶界面層的兩個模塊如果想跟資料庫交互都需要通過這個層來進行。這個應用層起到用戶界面跟資料庫操作進行解耦的作用。
Repositonry
倉儲層:這個層主要就是跟資料庫的交互了,任何跟資料庫有關的操作都在這層來進行實現,看了上面的圖相信你已經猜到了,前期我只是實現SqlServer的倉儲實現,至於其他資料庫的實現你只需要再建一個Czar.Cms.Repository.資料庫名 的倉儲實現就可以了!這裡我們也是採用依賴抽象而不依賴具體實現所以方便後期的擴展。
Entity
實體對象層:這個層感覺有點多餘,完全可以把這個界面融合到其他層,但是我並沒有這樣做,目的也是讓結構更清晰,更容易理解。這裡有兩個項目,相信一路看教程過來的朋友一定還記得我的第二篇文章《.NET Core實戰項目之CMS 第二章 入門篇-快速入門ASP.NET Core看這篇就夠了 》中用的是ViewModel而不是直接用實體對象了!因為實際引用中可能我們頁面中需要的數據跟我們資料庫中的數據並不完全一樣的,而且,有時候我們頁面中可能包含了更多地信息,這時候我們怎麼往視圖中傳遞數據呢?這時候我們就有了ViewModel的概念。比方說:我們的有一個訂單詳細頁要同時顯示訂單的信息,以及訂單對應的商品列表,這時候怎麼辦呢?我們用一個ViewModel包含了訂單實體,並且包含了商品的列表就可以更方便的把數據傳遞到視圖裡面了!
Infrastructure
基礎設施層:這個層也是我們代碼的核心層了,我們會在這裡實現很多我們通用的方法,比方說幫助類,對字元串String進行一些擴展,序列化與反序列化,HTTP請求,過濾器,日誌功能,中間件的擴展等等。總之這個裡麵包含了Czar.Cms的所有核心。
Test
測試層:這個層不用多說了吧,就是對系統進行測試的!裡面包含單元測試以及集成測試!
相信通過我上面的介紹你一定會感覺到這個CMS系統的開發框架的層次非常清晰了吧!其實作為新手時期的我也是,看到項目太多的話就從心裡面害怕,其實大伙大可不必,看到讓你害怕的事情就要勇敢的面對它,戰勝它,一定要跳出自己的舒適區。
GitHub與碼雲上的項目開源地址
今天我們搭建的這個項目的結構我已經同步更新到Github以及碼雲上了,有興趣的朋友可以下載查看!覺得不錯的歡迎Star
GitHub:https://github.com/yilezhu/Czar.Cms
碼雲:https://gitee.com/yilezhu/Czar.Cms
如果你覺得這個系列對您有所幫助的話,歡迎以各種方式進行支持,最簡單有效的就是博客園給個推薦,GitHub給個Star。同時今天我申請了一個DotNetCore實戰的訂閱號,有興趣的朋友可以微信關註下:
總結
本文我首先帶著大家理解了一下架構設計的目的,以及架構設計的演變性。接著對我們這個ASP.NET Core的CMS實戰項目進行了開發框架的設計。並對每個項目的所要實現的功能以及各自的職責進行了相關的介紹!相信你已經能夠清楚的明白了這個架構的思想!到此,設計篇已經結束,接下來就讓我們進行真正的項目開發吧即開發篇的開始!