[ASP.NET Core] 實現自定義的appsettings來源

實現自定義的appsettings來源

有時不想從appsetting讀取設定,如果想從DB或是其他地方讀取,可以怎麼做呢

以下做個簡單的範例


1.實作 IConfigurationProvider,不過這邊是直接繼承ConfigurationProvider,他也同樣實作了IConfigurationProvider

  • LoadData裡面則處理了怎麼拿到設定的這件事
  • OnReload是base的方法,後面可以用它通知訂閱者設定被異動了
    public class MyConfigProvider : ConfigurationProvider
    {
        public override void Load()
        {
            LoadData(false);
        }

        private void LoadData(bool reload)
        {
            //anything...
            Data["Version"] = DateTime.Now.Ticks.ToString();

            if (reload)
            {
                OnReload();
            }
        }
    }

2.接著實作一個IConfigurationSource

    public class MyConfigSource : IConfigurationSource
    {
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new MyConfigProvider();
        }
    }

3.在Startup註冊

        public void ConfigureServices(IServiceCollection services)
        {
            var configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.Add(new MyConfigSource());

            var configurationRoot = configurationBuilder.Build();
            services.Configure<MyConfig>(configurationRoot);
            
            services.AddControllers();
        }

4.接著回到Controller,並注入Config進來,我們就能拿到自定義來源的Config內容了

        public WeatherForecastController(IOptions<MyConfig> config)
        {
            _config = config;
        }

5.上面有提到可以在設定改變時做某些事情,可以使用ChangeToken來監視config異動

ChangeToken.OnChange(configurationRoot.GetReloadToken, () =>
{
    Console.WriteLine(DateTime.Now.Ticks);
});

Sample Code https://github.com/ianChen806/CustomConfigSample/tree/master