成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OrchardCore 如何動態加載模塊?

開發 前端
若對OrchardCore有所了解的童鞋應該知道,OrchardCore本身定位于CMS系統,同時整個架構并非前后分離,采用MVC模式開發,基于此,由于內置需要預編譯視圖以及考慮其他等等原因,不支持動態加載模塊,本文給出我所想到的動態加載模塊方案。

[[393778]]

本文轉載自微信公眾號「JeffckyShare」,作者Jeffcky 。轉載本文請聯系JeffckyShare公眾號。  

若對OrchardCore有所了解的童鞋應該知道,OrchardCore本身定位于CMS系統,同時整個架構并非前后分離,采用MVC模式開發,基于此,由于內置需要預編譯視圖以及考慮其他等等原因,不支持動態加載模塊,本文給出我所想到的動態加載模塊方案

OrchardCore基本使用示例

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

項目采用前后分離,所以我們創建WebAPi應用程序,為支持模塊化開發,如上圖下載模塊開發應用程序包

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

至此一個基本的模塊化項目就創建完畢,接下來我們創建模塊,官方提供模塊包模板引擎

通過對應命令將模板引擎下載至本地

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

然后我們在項目解決方案下,繼續通過CLI將下載至本地模板引擎來創建模塊項目,并引入到項目解決方案中

  1. dotnet new ocmodulecms -n Test 

由于我們用不到視圖,所以將視圖文件夾以及對應默認安裝包刪除,只需保留如下模塊包就好

  1. OrchardCore.Module.Targets 

同時也一并將項目文件中支持MVC配置給刪除,否則會生成視圖程序集,猜測應該會引起模塊加載依賴需額外加載視圖dll

我們將模塊默認創建控制器修改為訪問接口形式,方便接下來測試驗證

那么接下來我們應該如何將開發好的模塊進行加載呢?

OrchardCore動態加載模塊(前后分離)

了解OrchardCore基本原理的我們應該知道,默認情況下,主項目添加模塊引用時,會通過MSBuild在對應模塊程序集中,添加模塊標識,如下:

如上圖所示,一個是模塊標識,一個是對應文件路徑標識

當啟動主項目時,會找到對應程序集模塊標識,并注冊服務以及其他操作,如此看來,我們只需深入了解源碼中是否存在存儲對應模塊信息的接口呢?

查看底層模塊設施源碼,得知對外暴露其接口即IModuleNamesProvider

好家伙,我們將生成模塊dll放在主項目程序啟動modules目錄下,接下來我們實現該接口,如下:

  1. public class DynamicModuleNamesProvider : IModuleNamesProvider 
  2.     private readonly List<string> _moduleNames = new List<string>(); 
  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<ModuleMarkerAttribute>().Select(m => m.Name)); 
  22.         } 
  23.     } 
  24.  
  25.     public IEnumerable<string> GetModuleNames() 
  26.     { 
  27.         return _moduleNames; 
  28.     } 

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

  1. services.AddSingleton<IModuleNamesProvider, DynamicModuleNamesProvider>(); 

我們啟動主項目驗證確認,模塊已然進行加載,如下:

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

并未繼續深入查看源碼,至少可知,通過動態加載內置僅僅只注冊了相關服務,猜測是和移除對應視圖包有關導致并未激活控制器、視圖等等

OrchardCore動態加載模塊激活控制器

由于控制器、視圖、TagHelper等等相關FeatureProvider并未激活,所以我們借助AssemblyPart來實現,將其作為應用程序的一部分,通過掃描模塊,將對應控制器等激活,如下:

  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. }); 

雖然官方并未提供動態加載模塊示例,但我們依然可以借用其對外暴露接口來實現,理論上若是采用MVC模式,應該也可以進行動態加載

 

責任編輯:武曉燕 來源: JeffckyShare
相關推薦

2021-06-30 08:00:31

ECMAScriptimport 模塊JavaScript

2022-07-20 11:13:05

前端JSONVue3

2017-06-09 08:16:50

python動態模塊

2022-07-10 21:20:11

C語言Linux

2021-10-18 12:04:22

Spring BootJava開發

2021-10-18 10:36:31

Spring Boot插件Jar

2016-12-02 20:43:34

Android動態加載DL框架

2011-05-31 11:05:16

ListView 數據

2025-01-20 09:09:59

2011-07-06 16:15:46

iPhone 圖片

2020-04-14 08:00:00

KubernetesLinux

2020-07-16 07:50:53

Nginx模塊動態

2024-02-29 07:45:38

Nginx服務模塊

2009-08-28 16:14:26

C#實現加載動態庫

2011-06-24 09:01:20

Qt QLibrary dll

2009-12-17 09:56:26

Linux添加驅動模塊

2015-11-02 19:11:27

阮一峰javascript循環加載

2011-07-21 17:35:11

iPhone Table 圖片

2009-10-27 10:28:33

Silverlight

2011-07-25 15:32:06

iPhone Table 動態
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频精品在线 | 国产激情视频网 | 做a视频在线观看 | 激情欧美日韩一区二区 | 瑞克和莫蒂第五季在线观看 | 日韩一级黄色毛片 | 色婷婷精品久久二区二区蜜臂av | 国产午夜视频 | 91久久精品 | 日韩精品一区二区三区久久 | 欧美在线视频网站 | 亚洲一区 | 亚洲三级视频 | 亚洲视频区 | 久久精品国产亚洲a | av在线影院 | 国产一区二区三区四区三区四 | 久久99这里只有精品 | av在线一区二区 | 美女爽到呻吟久久久久 | 区一区二区三在线观看 | av黄色在线 | 9久久精品 | 美国一级黄色片 | 午夜精品一区二区三区三上悠亚 | 婷婷开心激情综合五月天 | 国产成人a亚洲精品 | 中文字幕av一区二区三区 | 99国产精品久久久 | 免费a级毛片在线播放 | 亚洲视频免费在线观看 | 国产丝袜一区二区三区免费视频 | 久久国产精品免费视频 | 天堂一区 | 免费观看日韩精品 | 99re国产视频 | 国产女人与拘做受视频 | 在线亚洲人成电影网站色www | 在线观看成人av | 亚洲一区二区三区视频 | 国产精品免费看 |