访问IOptions <t>对象.NET Core

时间:2017-10-31 12:55:08

标签: c# dependency-injection asp.net-core

我是.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>的示例。

3 个答案:

答案 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