SimplCommerce 是 github 上過千星的.netcore 商城示例項目,本文詳解他的模塊化框架現實思路,其業務(如產品、訂單)不作介紹。因作者文筆水平很差,它又很值得學習和推薦,就算不要臉獻丑一次吧,如對本文有不明白之處望見諒留言,謝謝。
早期單體開發框架,因為簡單上手快的特點廣受青睞。但是隨着項目時間的考驗,最終變得難以維護,臃腫、規范、污染等劣勢導致人力成本增加。文章后方有 ABP、微服務、模塊化、單體應用場景分析。
SimplCommerce 特點
分解
一個超級大的項目,主程可以按功能拆分成N個平行的小模塊,每位開發成員都清楚自己負責的模塊。
如上圖: Modules 目錄里的子項目都是分解后的模塊
獨立
新人是項目開發中最具破壞力的元凶之一,模塊間獨立、隔離可以有效的限制他們,避免核心模塊或整體污染。
每個模塊可以有自己的數據庫、配置(appsettings.json)、Controller、Views(razor模板)、wwwroot(靜態資源)
可擴展性
策划說要增加代理功能,新增一個模塊來開發,既不影響原有模塊,對開發人員等同是新的小項目,從而更簡單。
這個雪球可以一直滾下去,哪怕增加100個新模塊,給兵就能打勝仗。
可維護性
得益於分解、獨立特性,每個模塊代碼更少,交接成本、調試成本更低。
舉一個極端的例子,需求改不動了怎么辦,重構此模塊也不過如此吧,不必牽一發而動全身。
可組合性
模塊可單獨、或者組合部署。
比如獨立部署:Modules/SimplCommerce.Module.Orders 由於訪問量較大獨立到 A 服務器
比如組合部署:Modules/SimplCommerce.Module.Catalog、Modules/SimplCommerce.Module.Cms 由於沒有壓力獨立到 B 服務器
SimplCommerce 模塊化框架現實分析
如上圖,這是 Catalog 模塊的目錄結構,看上去和普通和 mvc 沒什么區別,仔細看他還少了點什么,對。。。沒有 Program.cs、Startup.cs
問:他怎么啟動運行呢?
答:模塊只負責現實功能,SimplCommerce.WebHost 才是啟動項目。
問:SimplCommerce.WebHost 啟動怎么加載 Catalog 里的 mvc 代碼?
答:請看 SimplCommerce.WebHost/SimplCommerce.WebHost.csproj
<Target Name="CopyModules" AfterTargets="Build"> <Exec WorkingDirectory="." Command="npm run gulp-copy-modules -- --configurationName $(ConfigurationName)" /> </Target>
編譯成功后執行 npm run gulp-copy-modules(源碼在 SimplCommerce.WebHost/gulpfile.js),采用 node + gulp 將 Modules 所有模塊編譯結果與所需資源復制到 WebHost 目錄之下。
編譯成功后的偽動作大致如下:
復制 SimplCommerce.Module.Catalog/bin/Catalog.dll 到 SimplCommerce.WebHost/Modules/Catalog/Catalog.dll
復制 SimplCommerce.Module.Catalog/Views/* 到 SimplCommerce.WebHost/Modules/Catalog/Views/
復制 SimplCommerce.Module.Catalog/appsettings.json 到 SimplCommerce.WebHost/Modules/Catalog/appsettings.json
復制 SimplCommerce.Module.Catalog/wwwroot/* 到 SimplCommerce.WebHost/wwwroot/
dotnet 運行 SimplCommerce.WebHost 時做了以下現實:
1、反射加載 Modules/Catalog/Catalog.dll、Modules/Catalog/Views,由於現實代碼過多,本文不貼出(現實源碼在此:SimplCommerce.WebHost/Extensions/ServiceCollectionExtensions.cs)
2、合並 appsettings.json 配置文件,采取了類似以下的代碼
var confg = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", true, true) .AddJsonFile("Modules/Catalog/appsettings.json", true, true);
3、wwwroot 已自然合並。。
問:SimplCommerce.WebHost 需要經常維護嗎?
答:不需要,它實現了動態加載模塊,項目開發人員只需要負責較簡單的 Module。
問:如果模塊定義太多,如何全部編譯?
答:由於 vs 太方便,右擊 Modules 目錄就可以全部編譯了。
源碼地址:https://github.com/simplcommerce/SimplCommerce
特別介紹,由於作者太菜2016年轉型 .net core 項目時,它就已經過了千星,星多代表着生態,且用且珍惜。
各大開發框架應用場景分析
ABP
基於 DDD 開發的實踐項目,.NETCore 2.0發布以后,國內很多個人用它學習上手,也有公司開始使用它開發項目。
絕對是大團隊才傷得起的選擇,學習和使用成本較高,作者編程13年玩不轉它,您要說我菜,我認。
它的缺點很多我就不說了,因為ABP粉絲太多怕被噴死。。至少他不適合我。
微服務
不多作介紹,這個詞是個程序員都聽過了解過,有很多實踐項目如eShopOnContainers,有人說玩轉他就通了一切。
我是這樣理解微服務應用場景的:
1、只有當服務器壓力很大的情況下,才考慮拆拆分微服務。
2、只有需求變動較小、訪問量超大的情況下,才考慮微服務架構,比如電商。
它需要很強的架構師。
它不適合小團隊。
它不適合做需求泛濫的項目。
它不適合功能型太復雜的項目。
模塊化
本文介紹的即是模塊化開發框架,天生適合中大型項目開發,並且為以后拆分成微服務架構奠定了基礎。
單體
適合個人或小型項目,優點:快。
總結
每種技術框架存在即是合理的,各有優點和缺點,沒有哪個最好哪個最壞,在合適的場景選擇合適的框架,它就是把雙刃劍,反之將貽誤終生。
花了半天時間寫這篇文章,希望點贊的兄弟下個月能加工資500,謝謝觀看。