首页 > 解决方案 > 一个服务,两个实例,如何使用 ASP.NET Core DI 进行配置?

问题描述

使用 ASP.NET Core 的选项模式,可以创建服务并使用两个单独的调用注册它。

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<MyService>();

    services.Configure<MyServiceOptions>(o => o.Param = 1);

    services.AddMvc();
};

但是,我完全不清楚如何以及是否可以实例化服务的两个实例并将不同的选项绑定到它们?即给定一些基类的两个特化,我们如何在它们之间共享一个选项类?

public class MyService {}

public class MyService1 : MyService {}

public class MyService2 : MyService2 {}

public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<MyService1>();
    services.AddTransient<MyService2>();

    // What goes here?
    // config for instance 1
    //services.Configure<MyServiceOptions>(o => o.Param = 1);
    // config for instance 2
    //services.Configure<MyServiceOptions>(o => o.Param = 2);

    services.AddMvc();
};

基本上我想要 IServiceCollection.AddDbContext 扩展方法之类的东西,但是对于服务,我已经查看了 EF Core 扩展方法,但我根本没有得到它们。

标签: c#asp.net-coredependency-injection

解决方案


听从@Kirk Karkin 的建议——

public class MyServiceOptions
{
    public int setting { get; set; }
}

public class MyService
{
    public MyService(IOptions<MyServiceOptions> options)
    {
        // TODO: Capture options.
    }
}

public class MyServiceOptions<TMyService> : MyServiceOptions
    where TMyService : MyService
{
}

现在我可以通过扩展它来创建这个服务的实例:

public class MyService1 : MyService
{
    public MyService1(IOptions<MyServiceOptions<MyService1>> options>):base(options) 
    {
    }
 }

然后在配置服务中注册多个实例很容易:

services.AddTransient<MyService1>();
services.AddScoped<MyService2>();
services.Configure<MyServiceOptions<MyService1>>(Configuration.GetSection("MyService1Settings"));
services.Configure<MyServiceOptions<MyService2>>(Configuration.GetSection("MyService2Settings"));

推荐阅读