这个问题是基于与this answer相关评论。
总之,问题是如何通过配置设置保存到网工作,而无需调用ConfigureServices建立依赖关系时注入为IConfiguration接口的依赖。
我原以为这将是做一个好办法:
IHostBuilder builder = new HostBuilder;
...
builder.ConfigureServices((context, services) =>
{
services.AddSingleton<IMyModelClass, MyModelClass>(sp => new MyModelClass(context.Configuration));
services.AddSingleton<IMyServiceClass, MyServiceClass>(sp => new MyServiceClass(new MyModelClass()));
})
在这里,MyModelClass是读取配置设置,像这样一类:
public class MyModelClass : IMyModelClass
{
public string MySetting { get; set; }
public MyModelClass(IConfiguration config)
{
this.MySetting = config["MySetting"];
}
}
因此,它封装了这些设置,并且可以被传递到需要访问的配置设置其它类(如MyServiceClass)。
但似乎这是不是最好的方法。任何进一步的建议?
所以,让我们假设有以下配置
{
"MyModelSection": {
"MySetting": "SomeValue"
}
}
这只是一个很简单的例子。
相关的模型看起来像
public class MyModelClass: IMyModelClass {
public string MySetting { get; set;}
}
上述可以从配置来萃取并用服务注册
builder.ConfigureServices((context, services) => {
var configuration = context.Configuration.
var myModel = configuration.GetSection("MyModelSection").Get<MyModelClass>();
services.AddSingleton<IMyModelClass, MyModelClass>(myModel);
services.AddSingleton<IMyServiceClass, MyServiceClass>();
})