OrchardCore实现模块化核心原理分析
【導(dǎo)讀】ABP?vNext并未過多探究,當(dāng)然其基于DDD理念分層清晰,靈活性、擴(kuò)展性自然也不在話下,但有些情況下我可能會首選OrchardCore,并非ABP?vNext不可
若改造項(xiàng)目,也因歷史遺留問題,數(shù)據(jù)庫表設(shè)計(jì)也可能存在不合理,此時(shí)從頭開始再搭建如此龐大的架子,感覺會有點(diǎn)虛空,同時(shí)也要考慮團(tuán)隊(duì)內(nèi)部情況,不是那么容易上手,反而可能會違背初心,花更多時(shí)間和精力在各種模型理解上
我們完全可以為后續(xù)做鋪墊,先搭建出底層基本設(shè)施,再基于此做靈活擴(kuò)展即可,每個(gè)公司項(xiàng)目具體情況都不一樣,比如倉儲模式可能需要結(jié)合項(xiàng)目進(jìn)行對應(yīng) 改造,倉儲只是提供了一種基本思想,若真將網(wǎng)上普遍流傳的模式照搬可能并不是那么好用,可能會認(rèn)為倉儲莫不是一種反模式?
.NET Core模塊化插件
.NET Core內(nèi)置提供了AssemblyLoadContext加載dll插件方式實(shí)現(xiàn)模塊化,然后將其進(jìn)行注冊
這種方式雖可行,在我看來只能作為一種臨時(shí)解決方案并不利于長期,因?yàn)樾桀~外創(chuàng)建一個(gè)新的項(xiàng)目,然后加載所生成dll,由于沒有底層設(shè)施做支撐,所以極易引起版本不一致問題,而且手動(dòng)被迫性質(zhì)太強(qiáng),實(shí)現(xiàn)模塊化方案最終的目標(biāo)則只需關(guān)注業(yè)務(wù)邏輯實(shí)現(xiàn),我們來看看OrchardCore如何實(shí)現(xiàn)模塊化。
OrchardCore模塊化思想
這里我們并不討論和ABP vNext二者誰更強(qiáng)大,沒有任何意義,比如需結(jié)合現(xiàn)有項(xiàng)目情況、項(xiàng)目大小、是否為多租戶、實(shí)施難度等等多方面考慮才能得出基本結(jié)論,而不是一味追求當(dāng)前主流
比如我們只是想實(shí)現(xiàn)模塊化方案,建議選擇OrchardCore來實(shí)施,因?yàn)楹芎唵?#xff0c;我們可將其剝離為我所用,而后結(jié)合項(xiàng)目情況是否考慮利用ABP vNext來進(jìn)行分層處理。借鑒核心思想、才能保證一切可在控制范圍內(nèi)
首先我們先從整體上對OrchardCore做個(gè)認(rèn)識,細(xì)枝末節(jié)暫不考慮:基于ASP.NET Core多租戶模塊化應(yīng)用框架。
?版本管理:無論是底層設(shè)施、基本框架、模塊都通過包管理,同時(shí)框架和包版本基本(包管理走框架包版本)可以統(tǒng)一管理(對于版本升級很重要)
核心思想:模塊實(shí)現(xiàn)模塊特性,通過MSBuild構(gòu)建主程序所添加實(shí)現(xiàn)模塊特性的模塊包,底層設(shè)施掃描模塊特性將其注冊到容器中,當(dāng)然模塊和模塊特性都可進(jìn)行基本信息描述
OrchardCore模塊化原理
整個(gè)項(xiàng)目架構(gòu)如下圖所示
OrchardCore:底層設(shè)施以及可能需要添加的組件(比如本地化、日志、文件存儲、緩存、Lucene等)
OrchardCore.Frameworks:MVC框架
OrchardCore.Modules:模塊化包(比如郵件服務(wù)、后臺作業(yè)服務(wù)、第三方集成等等)
OrchardCore.Modules.Cms:Cms模塊包
OrchardCore.Themes:主題管理
OrchardCore.Cms.Web:主程序
我以內(nèi)置所提供示例程序給大家講解整個(gè)詳細(xì)流程,而后有需要更細(xì)致了解的童鞋就可以很快上手了,如下示例主程序加載示例模塊,主程序直接采用引用該示例模塊(實(shí)際則是通過nuget下載該模塊)
正常情況下我們通過nuget直接下載的是程序包,而OrchardCore對于入口則是利用MSBuild加載targets文件(其他組件則直接下載對應(yīng)包),而targets引用對應(yīng)包,通過這種中轉(zhuǎn)方式根據(jù)我的理解主要解決了兩個(gè)問題,其一則是可以屏蔽底層設(shè)施包(一次性下載),最重要的是通過targets文件可自動(dòng)添加主程序程序集所加載模塊包特性
是不是感覺有點(diǎn)懵,那到底是如何加載模塊包特性的呢?來,請看如下圖,我們以實(shí)際操作從頭再來做一個(gè)完整梳理(注意:為排版美觀,如下都將省略O(shè)rchardCore前綴)
【1】創(chuàng)建Mvc.Web程序,在nuget上下載Application.Mvc.Targets包
【2】創(chuàng)建Mvc.HelloWorld模塊,在nuget上下載引用Module.Targets包
【3】Mvc.Web主程序引用我們所使用的Mvc.HelloWorld模塊
【4】Application.Mvc.Targets包引用Application.Targets(引入底層設(shè)施)和MVC.Core(引入MVC框架)
【5】示例模塊引入模塊包,該包中存在模塊特性(Module類)
【6】Application.Targets包下存在Application.Targets.targets文件,由于主程序引用了該包,添加所引用實(shí)現(xiàn)模塊特性的包程序集信息到主程序集
學(xué)習(xí)OrchardCore的前提一定要基本了解和會使用MSBuild,這里不詳細(xì)展開,此時(shí)我們生成解決方案,我們將會看到主程序集里面將會自動(dòng)生成所實(shí)現(xiàn)模塊特性的模塊程序集信息
到這里我們已經(jīng)研究完主程序如何識別模塊包,接下來則是如何加載模塊包以及對應(yīng)注冊服務(wù)信息
OrcharCore核心在于OrchardCore和OrchardCore.Abstractions這兩個(gè)底層設(shè)施包
歸根到底,其底層設(shè)施源碼一部分可能從官方源碼拷貝過來(自我猜測),為實(shí)現(xiàn)多租戶模式,勢必要構(gòu)建租戶的容器和路由中間件,這中間就涉及在容器中需要維護(hù)每一個(gè)租戶上下文(ShellContext),并且也要跟蹤每個(gè)租戶的狀態(tài)。
ModularTenantContainerMiddleware作為創(chuàng)建租戶容器中間件
ModularTenantRouterMiddleware作為租戶路由中間件
網(wǎng)上資料一大把,此處省略若干字,有任何疑問可評論區(qū)留言,盡力解答
OrchardCore模塊化實(shí)踐
我將核心進(jìn)行了剝離,實(shí)現(xiàn)了模塊化的一個(gè)demo,將多租戶這一塊我也進(jìn)行了去除,只保留了Shell相關(guān)基本概念,實(shí)際情況下,這些都可以去除,基于當(dāng)前請求構(gòu)建Scope,而無需再額外構(gòu)建ShellScope和上下文等等,考慮好釋放等問題就好
示例主程序?yàn)镸odularDemo.Web.Test,模塊為ModularCore.Test,啟動(dòng)主程序訪問模塊中接口
總結(jié)
以上是生活随笔為你收集整理的OrchardCore实现模块化核心原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年中国.NET开发者大会第二天
- 下一篇: 多款主流编程语言,哪款开发软件最安全?