c# - 一个服务,两个实例,如何使用 ASP.NET Core DI 进行配置?
问题描述
使用 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 扩展方法,但我根本没有得到它们。
解决方案
听从@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"));
推荐阅读
- delphi - Delphi listview更改标题文本
- xamarin - 我想了解 Xamarin.UItest 实际如何与应用交互
- scala - 根据请求模式创建子actor
- azure - Azure 订阅上的 Azure EventGrid - 确定哪个标记已更改
- javascript - Escaping Ocal literals in strings
- android - 禁用汉堡图标到箭头过渡动画片段
- javascript - 如何检测该页面已重新加载 Reactjs?
- jess - 比较嵌套 Java bean 的值
- sql-server - ExecuteReader 比 SSMS 慢得多
- html - 创建带有切碎透明角的按钮