我是.NET Core的新手,如果这是一个新手问题,我会道歉。 我使用VS 2017在.NET Core 2中创建了一个Web API项目。
对我来说,我有appsettings.json
个文件,其中包含一些连接设置。
在阅读了微软教程中的IOptions<T>
后,我正在做类似以下的事情:
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<MyOptions>(Configuration);
// I want to access MyOptions object here to configure other services?how do i do that?
service.AddHangfire( // Get MyOptions.HangfireConenctionString etc.)
}
如何访问MYOptions
中创建的ConfigureServices
对象,以及我是否需要使用Configure(IApplicationBuilder app,..)
方法访问该对象?
我只在教程中的控制器中看到了注入IOptions<T>
的示例。
答案 0 :(得分:10)
使用
中的一些设置public void ConfigureServices(IServiceCollection services)
{
// Load the settings directly at startup.
var settings = Configuration.GetSection("Root:MySettings").Get<MySettings>();
// Verify mailSettings here (if required)
service.AddHangfire(
// use settings variable here
);
// If the settings needs to be injected, do this:
container.AddSingleton(settings);
}
如果您需要在应用程序组件中使用配置对象不要将IOptions<T>
注入组件,因为这只会导致无法解决的问题,如{{3}所述}。而是直接注入值,如以下示例所示。
public class HomeController : Controller
{
private MySettings _settings;
public HomeController(MySettings settings)
{
_settings = settings;
}
}
答案 1 :(得分:3)
你很亲密
services.Configure<MyOptions>(options => Configuration.GetSection("MyOptions").Bind(options));
您现在可以使用依赖注入来访问MyOptions
public class HomeController : Controller
{
private MySettings _settings;
public HomeController(IOptions<MySettings> settings)
{
_settings = settings.Value
// _settings.StringSetting == "My Value";
}
}
我从安德鲁·洛克的这篇优秀文章中摘录了片段:https://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/。
答案 2 :(得分:0)
这取决于您的appsettings.json
和命名部分的方式。例如:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"MySettings": {
"ConnectionString": "post.gres:39484"
}
}
在这里,该部分的名称是 MySettings 。通常,在我的Startup.cs
的ASP.NET Core 2.2中,我使用类似的东西:
services.AddOptions();
services.Configure<MyOptions>(Configuration.GetSection("MySettings"));
但类似的方法也可以:
services.AddOptions();
services.AddOptions<MyOptions>().Bind(Configuration.GetSection("MySettings"));
如果已将程序配置为使用AddEnvironmentVariables()
,则还可以通过添加名为MySettings__ConnectionString
的配置变量来设置设置。 The value can come from multiple places。
如果您想validate your options class you might want to use Data Annotations。