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

时间:2019-05-22 11:59:45

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

使用ASP.NET Core的Options模式,可以创建Service并通过两个单独的调用进行注册。

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扩展方法,而我一无所获。

1 个答案:

答案 0 :(得分:2)

遵循@Kirk Karkin的建议-

365 + 2

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

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
{
}

然后在Configure Services中轻松注册多个实例:

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