2017-03-02 8 views
0

私はHomedataAccessクラスをインスタンス化しようとしていますが、それはコンストラクタ引数として文字列とインターフェイスIQueryManagerをとります。どのように登録すればいいですか?コンストラクタが別のインタフェースを取る場合、Simple Injectorでコンストラクタインジェクションを行う方法?

今まで、私は次のように行われていると、それは動作しますが、私はこの方法が好きではない:

Kernel.Register(() => new HomeDataAccess("anandv4", 
    new SqlServerQueryManager(new SqlServerConnectionManager()))); 

は、これを行う別の方法はありますか?

答えて

1

あなたがやっていることはうまく動作します。それには何も問題ありません。特にあなたのSqlServerQueryManagerSqlServerConnectionManagerはあなたのHomeDataAccessクラス内でのみ使用されます。

しかし、抽象化は複数の場所で使用されますが、登録が重複してメンテナンスを増やす原因となるため、より問題になります。

ソリューションは、次の操作を実行するために次のようになります。

Kernel.Register(() => new HomeDataAccess(
    "anandv4", 
    Kernel.GetInstance<IQueryManager>()); 

これの欠点は、しかし、それはその診断を実行したときに、これは完全にシンプルなインジェクターを盲目ということです。だからこれは勧告されていません。

ありがとうございますto extend単純なインジェクタで、これらのようなプリミティブな依存関係を登録できるようになりましたが、通常、プリミティブ値をDTOにラップする方が簡単です。例えば:詳細に入るための

Kernel.RegisterSingleton(new HomeDataAccessConfig("anandv4")); 
Kernel.Register<HomeDataAccess>(); 
Kernel.Register<IQueryManager>(() => 
    new SqlServerQueryManager(new SqlServerConnectionManager())); 
+0

感謝を:

public class HomeDataAccessConfig { public readonly string UserName; public HomeDataAccessConfig (string userNamr) { if (string.IsNullOrWhiteSpace(userName)) throw new ... this.Usrrname = userName. } } public class HomeDataAccess { private readonly HomeDataAccessConfig config; private readonly IQueryManager manager; public HomeDataAccess(HomeDataAccessConfig config, IQueryManager manager) { this.config = config; this.manager = manager; } } 

これは次のようにあなたが登録を行うことができます。私は、単純なユーザー名プロパティを個別のIUserインターフェイスに抽象化できることを発見しました。これにより、以下を実行するのに役立ちます。 Kernel.Register (); Kernel.Register (); Kernel.Register (); –

+0

このユーザー名は、実行中のアプリケーションの存続期間中一定であるか、または要求ごとに変更されますか?(現在の要求をトリガーしたユーザーの名前です) – Steven

関連する問題