SimpleInjector:注册 class 具有数据参数和依赖项

SimpleInjector: Registration of class that has data parameters, and a dependency

注册构造函数中只有数据参数的服务非常简单。

string emailHost = "emailHost";
int emailPort = 25;
string emailFrom = "fake@fake.cc";

container.Register<IEmailManager>(
    () => new EmailManager(emailHost, emailPort, emailFrom),
    Lifestyle.Singleton);

但是,如果 class/service 具有数据参数, 注入服务,我该怎么做?我怎样才能将注册的 SmsNumberFormatter 放入 SmsManager,它仍然通过 ctor 提供短信配置数据?

string smsAccountSid = "sid";
string smsAuthToken = "token";
string smsFromNumber = "##########";

container.Register<ISmsNumberFormatter, SmsNumberFormatter>(
    Lifestyle.Singleton);

container.Register<ISmsManager>(
    () => new SmsManager(
        new SmsNumberFormatter(), smsAccountSid, smsAuthToken, smsFromNumber), 
    Lifestyle.Singleton);

SimpleInjector:v 3.3.2.0

你有两个选择:

1。使用容器获取你的依赖

container.Register<ISmsManager>(() => 
        new SmsManager(container.GetInstance<ISmsNumberFormatter>(),
        smsAccountSid, 
        smsAuthToken, 
        smsFromNumber), Lifestyle.Singleton);

2。将您的基本类型参​​数变成一个可注入的 class

public class SmsManagerOptions
{
    public SmsManagerOptions(string smsAccountSid, string smsAuthToken, string smsFromNumber)
    {
        SmsAccountSid = smsAccountSid ?? throw new ArgumentNullException(nameof(smsAccountSid));
        SmsAuthToken = smsAuthToken ?? throw new ArgumentNullException(nameof(smsAuthToken));
        SmsFromNumber = smsFromNumber ?? throw new ArgumentNullException(nameof(smsFromNumber));
    }

    public string SmsAccountSid { get; }
    public string SmsAuthToken { get; }
    public string SmsFromNumber { get; }
}

当然,您需要将 SmsManager ctor 更改为 public SmsManager(ISmsNumberFormatter formatter, SmsManagerOptions options).

然后在你的DI注册方式中:

var options = new SmsManagerOptions("sid", "token", "######");

container.Register<ISmsNumberFormatter, SmsNumberFormatter>(Lifestyle.Singleton);
container.RegisterSingleton<SmsManagerOptions>(options);
container.Register<ISmsManager, SmsManager>(Lifestyle.Singleton);

备注

我认为第二个选项更干净,但您可以自由选择您喜欢的那个。