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);
备注
我认为第二个选项更干净,但您可以自由选择您喜欢的那个。
注册构造函数中只有数据参数的服务非常简单。
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);
备注
我认为第二个选项更干净,但您可以自由选择您喜欢的那个。