ASP.Net Core承載外部程序集


故事背景

  一般情況下ASP.Net Core項目配置可以直接在appsetting.json中添加,也可以在項目中添加新的配置文件。但如果想和其他項目一起實現配置文件通用呢?我們可以用絕對定位去訪問配置文件,但可能會遇到訪問權限之類的問題;我們也可以通過開發配置文件訪問接口來實現,但太麻煩了,而且不可能加了一個配置我就去改一次訪問代碼。那么,官方有木有提供什么方案呢?

  有的,微軟官方提供了允許ASP.Net Core承載外部程序集功能,實現邏輯就是通過外部類實現IHostingStartup接口,在啟動時從外部程序集向應用添加增強功能。針對我們前面提到的外部項目向ASP.Net Core中添加配置文件需求是如何實現的呢?無非ASP.Net Core在啟動時執行啟動依賴程序集中指定特性的類中的Configure方法,而在該方法下將需要共享的配置添加到ASP.Net Core運行時中。

基本流程

外部類庫程序集
  • 創建類庫項目HostingStartupLibrary

  • 打開Nuget管理界面,依次安裝Microsoft.AspNetCore.Hosting(2.2.7)Microsoft.Extensions.Configuration(3.0.0)包。

  • 新增承載類ServiceKeyInjection,實現IHostingStartup接口的Configure方法,添加部分數據到內存中。

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    
    [assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))]
    namespace HostingStartupLibrary
    {
        public class ServiceKeyInjection : IHostingStartup
        {
            var dict = new Dictionary<string, string>()
            {
                {"DevAccount_FromLibrary", "DEV_1111111-1111"}
            };
    
            //配置方法一:主項目配置優先加載,再加載當前配置。
            builder.ConfigureAppConfiguration(config =>
            { 
                config.AddInMemoryCollection(dict);
            });
    
            //配置方法二:當前配置優先加載,再加載主項目配置。
            //var builderConfig = new ConfigurationBuilder().AddInMemoryCollection(dict).Build();
            //builder.UseConfiguration(builderConfig); 
        }
    }
    
ASP.Net Core主項目
  • 添加對類庫項目HostingStartupLibrary的引用,也可以直接引用類庫項目編譯后的dll文件。
  • 配置主機啟動依賴程序集,配置方法有兩種:主機配置與環境變量配置。若同時設置了主機配置與環境變量配置,則實際采用主機配置控制。
    • 主機配置

      • 打開Program.cs,找到CreateHostBuilder方法。
      • UseStartup<Startup>()之前,webBuilder之后添加UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostingStartupLibrary"),HostingStartupLibrary即為外部程序集的名稱。
    • 環境變量配置

      • 打開launchSettings.json文件;
      • 找到所有的environmentVariables節點,在該節點下面添加ASPNETCORE_HOSTINGSTARTUPASSEMBLIES,值為HostingStartupLibrary,即外部程序集名稱。
  • 配置獲取測試。
    • 通過構造函數注入,將IConfiguration注入到控制器中。
    • 通過config["DevAccount_FromLibrary"]形式獲取配置數據,判斷是否正確。

詳細解讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM