AspNet Core 1.1将IOptions注入类中

时间:2017-06-29 03:06:16

标签: asp.net-core

我在AspNet Core 1.1应用程序中使用Options模式。一切都根据文档设置:

public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }
        
public void ConfigureServices(IServiceCollection services)
        {
          ...
          services.Configure<AppOptions>(Configuration);
          ...
        }

我想将AppOptions类注入我正在创建的服务中:

public class MyService
{
private readonly AppOptions options;
  public MyService(IOptions<AppOptions> optionsAssesor)
        {
            options = optionsAssesor.Value;
        }
  
  ...
}

我的问题是:当我尝试创建MyService类的实例时:

MyService svc = new MyService();

我收到一条错误消息,指出没有给出与所需形式参数选项相对应的参数Assesor 如何利用DI并将AppOptions注入我的服务?

我是.NET Core的新手,所以我猜我错过了一些简单的东西,但我无法弄清楚是什么。

谢谢。

2 个答案:

答案 0 :(得分:2)

我假设Service(MyService)在ASP.net核心项目的范围内。

你必须做以下事情。

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<MyService>();
    ... other things
}

现在假设您正在使用您的服务(或者您想要使用您的服务某些控制器,那么您必须这样做

public class HomeController : Controller
{
    private MyService _myService = null;
    public HomeController(MyService service)
    {
         _myService = service;
    }
    // now you can use _myService in your controller method.
}

像你这样的事情必须经历依赖。

更新1

现在假设您想在另一个类中使用它,那么您可以这样做。

例如,另一个类是MyClass1。

public class MyClass1 
{
     private MyService _myService = null;
     public MyClass1(MyService service)
     {
          _myService = service;
     }
}

现在,如果我的想法是正确的,那么如果你使用的是ASP.net核心,那么MyClass1将由Controller使用。你必须为此注册依赖。

  services.AddScoped<MyClass1>(); // This should be in your ConfigureServices.

答案 1 :(得分:1)

这取决于您尝试从哪里获取MyService实例。基本上你需要获得对服务集合的引用(并在启动时在DI中注册MyService),构建服务提供者,然后获得服务。这将允许DI构造MyService的实例并将其传递给AppOptions的实例。

例如:

var provider = serviceCollection.BuildServiceProvider();

var myService = provider.GetService<MyService>();

话虽如此,在ASP.NET Core的大多数地方你都不需要这样做,最好通过Controller / Middleware构造函数获取MyService实例,而不必自己构建服务提供者。 / p>

您应该查看ASP.NET核心中的Microsoft Docs on Dependency Injection,以进一步了解不同的服务生命周期。