一个服务,两个实例,如何使用ASP.NET Core DI进行配置?

Chr*_*cke 3 c# dependency-injection asp.net-core

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

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

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

    services.AddMvc();
};
Run Code Online (Sandbox Code Playgroud)

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

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();
};
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*cke 7

遵循@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
{
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyService1 : MyService
{
    public MyService1(IOptions<MyServiceOptions<MyService1>> options>):base(options) 
    {
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

services.AddTransient<MyService1>();
services.AddScoped<MyService2>();
services.Configure<MyServiceOptions<MyService1>>(Configuration.GetSection("MyService1Settings"));
services.Configure<MyServiceOptions<MyService2>>(Configuration.GetSection("MyService2Settings"));
Run Code Online (Sandbox Code Playgroud)