Один сервис, два экземпляра, как настроить ASP.NET Core DI? - PullRequest
1 голос
/ 22 мая 2019

С помощью шаблона параметров 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, и я их вообще не получаю.

1 Ответ

2 голосов
/ 23 мая 2019

Следуя совету @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"));
...