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