2017-05-07 17 views
0

データパラメータのみを持つサービスの登録は簡単です。SimpleInjector:データパラメータと依存関係を持つクラスの登録

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

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

しかし、クラス/サービスは、データ偶然に、注入されたサービスを持っている場合、私はそれをどのように行うのですか?登録したSmsNumberFormatterSmsManagerに登録するにはどうすればいいですか?まだctor経由でsms設定データを提供していますか?

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

あなたは2つのオプションがあります。

1.コンテナを使用して、あなたの依存関係を取得するために

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

2.あなたの基本的なタイプを回しパラメータを1つの注入可能なクラスにまとめる

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

私は2番目のオプションはクリーンであると信じていますが、あなたが好きなものを自由に選択できます。

+1

2番目のオプションに投票します。クリーナーだけでなく、[Diagnostic Services](https://simpleinjector.org/diagnostics)を使用してSimple Injectorがオブジェクトグラフの分析を継続できるようにします。 – Steven

+0

詳細な対応をお寄せいただきありがとうございます。 – contactmatt

+0

私は 'SmsManagerOptions'を不変で、readonlyのプロパティと必要な値を受け入れるコンストラクタで作成します。これは 'SmsManagerOptions'がfaulty状態で初期化されるのを防ぎます。 – Steven

関連する問題