ASP.NET Core DI不同的选项实例取决于请求类

时间:2018-04-07 18:54:09

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

我过去曾经使用过Autofac,虽然有时它可能有点复杂但它从来没有缺少我需要的功能。现在我试图在ASP.NET Core中使用内置的依赖注入,并且无法实现以下功能:

Startup.cs

public void ConfigureServices(IServiceCollection services) {
  // Use these settings by default
  services.Configure<EmailerSettings>(Configuration.GetSettings("DefaultEmailer"));

  // Would like to specify different settings that apply to the SpecialEmailer class only
  //services.Configure<EmailerSettings>(Configuration.GetSettings("SpecialEmailer"));
}

依赖于DI的类

public class Emailer {
    public Emailer(IOptions<EmailerSettings> settings) {
       // Should get the default settings
    }
}

public class SpecialEmailer {
    public SpecialEmailer(IOptions<EmailerSettings> settings) {
       // Should get the special settings
    }
}

开箱即用的DI有没有办法做到这一点?我当然可以创建SpecialEmailerSettings并在SpecialEmailer类中使用它,但结构是相同的,所以我想尽可能重用。

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,但我不认为它们中的任何一种都是如你所希望的那样优雅。我猜您最好的办法是创建一个继承自SpecialEmailerSettings的其他设置模型EmailerSettings。我知道你已经想到了这个并且你想重用,但我认为继承是一种重用方式。这只是一个额外的一行:

public class SpecialEmailerSettings : EmailerSettings { }

然后加载它:

services.Configure<EmailerSettings>(Configuration.GetSettings("DefaultEmailer"));
services.Configure<SpecialEmailerSettings>(Configuration.GetSettings("SpecialEmailer"));

最后在你的课堂上使用它:

public class SpecialEmailer {
    public SpecialEmailer(IOptions<SpecialEmailerSettings> settings) {
       // Should get the special settings
    }
}