要解决的问题: 这里有一个设置列表,可以说:
{
"Kind1":
{"attr1":"val11"},
{"attr2":"val12"},
"Kind2":
{"attr1":"val21"},
{"attr2":"val22"},
}
和.NET Core 2.1中的使用者类(控制器),需要访问以上配置才能使用Kind1或Kind2。
假设已经在C#中定义了相应的类:
public class KindSetting
{
public string attr1{get;set;}
public string attr2{get;set;}
}
现在,将配置注入使用者对象的最佳方法是什么。
是否可以将IConfiguration
实例注入使用者对象并像这样使用它?
KindSetting kindSetting =_configuration.GetValue<KindSetting>(kindSettingKey);
是否有更好的方法来满足上述要求?
答案 0 :(得分:1)
在startup.com文件中,可以使用configureservices方法进行配置。下面的示例代码:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//Need to add following linse
services.Configure<KindSetting>(Configuration.GetSection("Kind1"));
}
添加到服务中后,您可以将此配置注入您的类中,如下所示:
public class HomeController : Controller
{
private readonly IOptions<KindSetting> _KindSetting;
public HomeController(IOptions<KindSetting> KindSetting)
{
_KindSetting = KindSetting
}
public void myFunction()
{
var mysetting = _KindSetting.Value.attr1
}
}
答案 1 :(得分:0)
我使用了以下方法,但是我不确定是最好的方法
在启动类配置方法中:
services.Configure<List<KindSetting>>(Configuration.GetSection("KindSettingList"));
以及在消费者对象方面:
public ConsumerController(IOptions<List<KindSetting>> kindSettingsListAccessor,...)
答案 2 :(得分:-2)
添加MainPanel
之后,您可以通过将DI添加到构造函数中来注入配置。
services.Configure<KindSettings>
或
IOptionsSnapshot<KindSettings> kindSettingsConfiguration
区别在于,IOptions<KindSettings> kindSettingsConfiguration
将反映配置文件中的实时更改,而IOptionsSnapshot
仅用于单例使用。
评论后编辑:
可以说您的配置文件如下:
IOptions
要成功绑定它,您将需要两个配置类
{
"Kind1":
{"attr1":"val11"},
{"attr2":"val12"},
"Kind2":
{"attr1":"val21"},
{"attr2":"val22"},
}
并且如前所述,只需添加点即可连接点
public class Kind1Configuration
{
public string Attr1 { get; set; }
public string Attr2 { get; set; }
}
public class Kind2Configuration
{
public string Attr1 { get; set; }
public string Attr2 { get; set; }
}
要在控制器中使用它,请将IOptions添加到构造函数中
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Kind1Configuration>(Configuration.GetSection("Kind1"));
services.Configure<Kind2Configuration>(Configuration.GetSection("Kind2"));
}
希望有帮助。