2017-05-07 61 views
0

註冊只有數據參數的服務很容易。SimpleInjector:註冊具有數據參數和相關性的類

string emailHost = "emailHost"; 
int emailPort = 25; 
string emailFrom = "[email protected]"; 

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

但我怎麼做,如果該類/服務有數據paramters,注入服務?我怎樣才能將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

回答

2

你有兩個選擇:

1.使用容器來獲得你的依賴

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

2.把你的基本類型參數轉化爲單一的可注射級別

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); 

注意

我認爲第二個選項是清潔的,但你可以自由選擇你喜歡的一個。

+1

我投第二個選項。不僅更清潔,而且允許Simple Injector使用其[Diagnostic Services](https://simpleinjector.org/diagnostics)繼續分析您的對象圖。 – Steven

+0

感謝您的詳細回覆,以不同的方式處理此問題! – contactmatt

+0

我甚至會讓'SmsManagerOptions'不可變,只讀屬性和接受所需值的構造函數。這可以防止'SmsManagerOptions'在發生故障的狀態下被初始化。 – Steven

相關問題