簡體   English   中英

一項服務,兩個實例,如何使用ASP.NET Core DI進行配置?

[英]One service, two instances, how to configure with ASP.NET Core DI?

使用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擴展方法,但我一無所獲。

遵循@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) 
    {
    }
 }

然后在Configure Services中注冊多個實例很容易:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM