gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:15:25 26 4
gpt4 key购买 nike

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

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

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

services.AddMvc();
};

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

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

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

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

关于c# - 一个服务,两个实例,如何使用 ASP.NET Core DI 进行配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56256332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com