實現自定義的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