91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OrchardCore 如何動態加載模塊

發布時間:2021-07-07 18:33:48 來源:億速云 閱讀:230 作者:chen 欄目:web開發

這篇文章主要講解了“OrchardCore 如何動態加載模塊”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“OrchardCore 如何動態加載模塊”吧!

OrchardCore基本使用示例

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

OrchardCore 如何動態加載模塊

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

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

OrchardCore 如何動態加載模塊

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

OrchardCore 如何動態加載模塊

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

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

OrchardCore 如何動態加載模塊

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

dotnet new ocmodulecms -n Test

OrchardCore 如何動態加載模塊

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

OrchardCore.Module.Targets

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

OrchardCore 如何動態加載模塊

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

OrchardCore 如何動態加載模塊

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

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

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

OrchardCore 如何動態加載模塊

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

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

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

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

public class DynamicModuleNamesProvider : IModuleNamesProvider {     private readonly List<string> _moduleNames = new List<string>();      public DynamicModuleNamesProvider()     {         var baseDirectory = AppContext.BaseDirectory;          var location = Path.Combine(baseDirectory, "modules");          if (!Directory.Exists(location))         {             return;         }          foreach (var file in Directory.EnumerateFiles(location))         {             var assemblyPath = Path.Combine(location, file);              var assembly = Assembly.LoadFrom(assemblyPath);              _moduleNames.AddRange(assembly.GetCustomAttributes<ModuleMarkerAttribute>().Select(m => m.Name));         }     }      public IEnumerable<string> GetModuleNames()     {         return _moduleNames;     } }

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

services.AddSingleton<IModuleNamesProvider, DynamicModuleNamesProvider>();

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

OrchardCore 如何動態加載模塊

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

OrchardCore 如何動態加載模塊

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

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

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

var builders = services.AddControllers();  builders.ConfigureApplicationPartManager(apm => {     var baseDirectory = AppContext.BaseDirectory;      var location = Path.Combine(baseDirectory, "modules");      if (!Directory.Exists(location))     {         return;     }      foreach (var file in Directory.EnumerateFiles(location))     {         var assemblyPath = Path.Combine(location, file);          var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyPath);          var assemblyPart = new AssemblyPart(assembly);          apm.ApplicationParts.Add(assemblyPart);     } });

OrchardCore 如何動態加載模塊

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

感謝各位的閱讀,以上就是“OrchardCore 如何動態加載模塊”的內容了,經過本文的學習后,相信大家對OrchardCore 如何動態加載模塊這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

忻州市| 隆子县| 长宁县| 宜兴市| 视频| 林西县| 兴化市| 陵川县| 北京市| 彭州市| 石台县| 晋中市| 宣汉县| 临西县| 扎囊县| 庆安县| 平果县| 托克逊县| 东阳市| 广南县| 沿河| 连山| 香河县| 遂平县| 西昌市| 湄潭县| 景泰县| 东乌珠穆沁旗| 南召县| 山东省| 开平市| 渑池县| 新昌县| 香港| 晋城| 永清县| 什邡市| 贵溪市| 永春县| 天水市| 庐江县|