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

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

使用 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/

相关文章:

c# - 使用队列创建 BackgroundWorker

c# - 在 C# 中使用 sqlite 进行 SQL 转义

c# - View 中的 session 变量

c# - 如何确定在 Simple Injector 中使用哪种生活方式

angular - 仍然需要 Angular 服务模块吗?

c# - 我如何从下面的代码中编写 TDD 代码?

c# - SqlCeCommand 可空值

c# - .Net Core/ASP5 应用程序的构建路径是什么?

c# - 在iis上部署后Windows身份验证不起作用

c# - 依赖注入(inject)容器 : how to handle objects that aren't a dependency of anything?