日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
OrchardCore如何動(dòng)態(tài)加載模塊?

本文轉(zhuǎn)載自微信公眾號(hào)「JeffckyShare」,作者Jeffcky 。轉(zhuǎn)載本文請(qǐng)聯(lián)系JeffckyShare公眾號(hào)。

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作與策劃設(shè)計(jì),明水網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:明水等地區(qū)。明水做網(wǎng)站價(jià)格咨詢:028-86922220

若對(duì)OrchardCore有所了解的童鞋應(yīng)該知道,OrchardCore本身定位于CMS系統(tǒng),同時(shí)整個(gè)架構(gòu)并非前后分離,采用MVC模式開發(fā),基于此,由于內(nèi)置需要預(yù)編譯視圖以及考慮其他等等原因,不支持動(dòng)態(tài)加載模塊,本文給出我所想到的動(dòng)態(tài)加載模塊方案

OrchardCore基本使用示例

OrchardCore采用包管理各個(gè)模塊,所以有自建NuGet,我們提前配置好OrchardCore程序包源

項(xiàng)目采用前后分離,所以我們創(chuàng)建WebAPi應(yīng)用程序,為支持模塊化開發(fā),如上圖下載模塊開發(fā)應(yīng)用程序包

緊著在Startup文件中,添加OrchardCore服務(wù)以及使用其中間件,如下圖

至此一個(gè)基本的模塊化項(xiàng)目就創(chuàng)建完畢,接下來我們創(chuàng)建模塊,官方提供模塊包模板引擎

通過對(duì)應(yīng)命令將模板引擎下載至本地

 
 
 
 
  1. dotnet new -i OrchardCore.ProjectTemplates::1.0.0-rc2-16113 --nuget-source https://nuget.cloudsmith.io/orchardcore/preview/v3/index.json 

然后我們?cè)陧?xiàng)目解決方案下,繼續(xù)通過CLI將下載至本地模板引擎來創(chuàng)建模塊項(xiàng)目,并引入到項(xiàng)目解決方案中

 
 
 
 
  1. dotnet new ocmodulecms -n Test 

由于我們用不到視圖,所以將視圖文件夾以及對(duì)應(yīng)默認(rèn)安裝包刪除,只需保留如下模塊包就好

 
 
 
 
  1. OrchardCore.Module.Targets 

同時(shí)也一并將項(xiàng)目文件中支持MVC配置給刪除,否則會(huì)生成視圖程序集,猜測(cè)應(yīng)該會(huì)引起模塊加載依賴需額外加載視圖dll

我們將模塊默認(rèn)創(chuàng)建控制器修改為訪問接口形式,方便接下來測(cè)試驗(yàn)證

那么接下來我們應(yīng)該如何將開發(fā)好的模塊進(jìn)行加載呢?

OrchardCore動(dòng)態(tài)加載模塊(前后分離)

了解OrchardCore基本原理的我們應(yīng)該知道,默認(rèn)情況下,主項(xiàng)目添加模塊引用時(shí),會(huì)通過MSBuild在對(duì)應(yīng)模塊程序集中,添加模塊標(biāo)識(shí),如下:

如上圖所示,一個(gè)是模塊標(biāo)識(shí),一個(gè)是對(duì)應(yīng)文件路徑標(biāo)識(shí)

當(dāng)啟動(dòng)主項(xiàng)目時(shí),會(huì)找到對(duì)應(yīng)程序集模塊標(biāo)識(shí),并注冊(cè)服務(wù)以及其他操作,如此看來,我們只需深入了解源碼中是否存在存儲(chǔ)對(duì)應(yīng)模塊信息的接口呢?

查看底層模塊設(shè)施源碼,得知對(duì)外暴露其接口即IModuleNamesProvider

好家伙,我們將生成模塊dll放在主項(xiàng)目程序啟動(dòng)modules目錄下,接下來我們實(shí)現(xiàn)該接口,如下:

 
 
 
 
  1. public class DynamicModuleNamesProvider : IModuleNamesProvider 
  2.     private readonly List _moduleNames = new List(); 
  3.  
  4.     public DynamicModuleNamesProvider() 
  5.     { 
  6.         var baseDirectory = AppContext.BaseDirectory; 
  7.  
  8.         var location = Path.Combine(baseDirectory, "modules"); 
  9.  
  10.         if (!Directory.Exists(location)) 
  11.         { 
  12.             return; 
  13.         } 
  14.  
  15.         foreach (var file in Directory.EnumerateFiles(location)) 
  16.         { 
  17.             var assemblyPath = Path.Combine(location, file); 
  18.  
  19.             var assembly = Assembly.LoadFrom(assemblyPath); 
  20.  
  21.             _moduleNames.AddRange(assembly.GetCustomAttributes().Select(m => m.Name)); 
  22.         } 
  23.     } 
  24.  
  25.     public IEnumerable GetModuleNames() 
  26.     { 
  27.         return _moduleNames; 
  28.     } 

將其以單例形式注入,如下

 
 
 
 
  1. services.AddSingleton(); 

我們啟動(dòng)主項(xiàng)目驗(yàn)證確認(rèn),模塊已然進(jìn)行加載,如下:

但是訪問控制器接口卻顯示404

并未繼續(xù)深入查看源碼,至少可知,通過動(dòng)態(tài)加載內(nèi)置僅僅只注冊(cè)了相關(guān)服務(wù),猜測(cè)是和移除對(duì)應(yīng)視圖包有關(guān)導(dǎo)致并未激活控制器、視圖等等

OrchardCore動(dòng)態(tài)加載模塊激活控制器

由于控制器、視圖、TagHelper等等相關(guān)FeatureProvider并未激活,所以我們借助AssemblyPart來實(shí)現(xiàn),將其作為應(yīng)用程序的一部分,通過掃描模塊,將對(duì)應(yīng)控制器等激活,如下:

 
 
 
 
  1. var builders = services.AddControllers(); 
  2.  
  3. builders.ConfigureApplicationPartManager(apm => 
  4.     var baseDirectory = AppContext.BaseDirectory; 
  5.  
  6.     var location = Path.Combine(baseDirectory, "modules"); 
  7.  
  8.     if (!Directory.Exists(location)) 
  9.     { 
  10.         return; 
  11.     } 
  12.  
  13.     foreach (var file in Directory.EnumerateFiles(location)) 
  14.     { 
  15.         var assemblyPath = Path.Combine(location, file); 
  16.  
  17.         var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath); 
  18.  
  19.         var assemblyPart = new AssemblyPart(assembly); 
  20.  
  21.         apm.ApplicationParts.Add(assemblyPart); 
  22.     } 
  23. }); 

雖然官方并未提供動(dòng)態(tài)加載模塊示例,但我們依然可以借用其對(duì)外暴露接口來實(shí)現(xiàn),理論上若是采用MVC模式,應(yīng)該也可以進(jìn)行動(dòng)態(tài)加載


網(wǎng)站標(biāo)題:OrchardCore如何動(dòng)態(tài)加載模塊?
標(biāo)題URL:http://www.5511xx.com/article/coshcjg.html