2011-08-15 12 views
6

私は従来のコードを作成しています。StructureMap明示的なコンストラクタ引数の指定

私は、依存関係のコンストラクタに対して異なる引数を渡す同じクラスの異なるメソッドを持っています。私はいくつかの基本的なIoCの使い方を紹介しようとしています。実際の性質は私が場所に応じてconstructorArgAとBの変更のために渡さ

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
     new Dictionary<string, object> { 
      { "constructorArgA", notShown }, 
      { "constructorArgB", redacted.Property } })); 

:今私はのStructureMapは、このように私の引数を渡す必要があります。

x.For<IHidden>().Use<RealType>() 
    .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
     (context) => someMethodToGetIConfig())); 

私は最初からこれを書いていた場合、私は構造おそらくたい:代わりに「constructorArgA」の

は次のように、のObjectFactoryを設定するときに行うことができますように、実際のタイプを経由してこれを設定する方法がありますこれを避けるためには依存関係が少し違っていますが、それは私の選択肢ではありません。

+0

コンストラクタインジェクションの代わりにプロパティインジェクションに切り替える必要がありますか? –

答えて

3

これはDIコンテナの古典的/よくある質問です。

私はまず、 "手動"の抽象ファクトリを作成してIThingInterfaceを作成し、次にStructuremapを使用して必要な場所にIThingInterfaceFactoryを注入することになります。マニュアルファクトリでは、新しいThingInterface()を呼び出してそれを返すクラスを意味します。このようにすれば、実装はもはやコンテナ管理されなくなり、に依存関係がある場合、それらはもはやコンテナによって提供されなくなります(問題があるかもしれません)。

第2の選択肢は、実際にコンテナを使用/ラップする抽象ファクトリを作成することです。基本的に最初のコードスニペットですが、Create()メソッドがパラメータを取るファクトリクラスにラップされています。これは、コンテナ管理されているすべての(実装とその依存関係を含む)利点がありますが、コンテナを直接参照することの欠点です(ベストプラクティスではありません - Article on Composition Roots参照)。

セッター注入もできますが、私は個人的には最後の手段と考えています。

ウィンザー城には、この問題(Typed Factory Facility)の良い解決策があります。オプションでコンテナを切り替えるかどうかはわかりませんが、考慮する可能性があります。

関連する問題