2011-01-12 11 views
7

私はStructureMapが新しく、既存のいくつかの既存のコードがあります。これは、StructureMap 2.5.4を使用しています。StructureMapとIEnumerableのインジェクト<T>

IEnumerable<ICar>をパラメータとするコンストラクタを持つStructureMapを使用して構築されたクラスがあります。

レジストリには次のコードがあります。

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.WithDefaultConventions(); 
    x.AddAllTypesOf<ICar>(); 
    } 
); 

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
      x => ObjectFactory.GetAllInstances<ICar>()); 

私は単体テストを作成しており、ObjectFactoryからネストされたコンテナを取得し、Injectメソッドを使用してインスタンスを注入しました。 ICarのインスタンスの1つは、コンストラクタで注入型を受け取る必要があります。しかし、それは動作していませんでしたし、私はそれを私の入れ子のコンテナを使用しないObjectFactory.GetAllInstances()呼び出しまで追跡しました。

これを動作させるにはどうすればよいですか?

また、構造体のautowiring配列とIEnumerableインスタンスについても読んでいますが、動作させることができませんでした。

上記のレジストリコードを書き換えて、IEnumerable<ICar>のインスタンスを作成し、入れ子になったコンテナの注入されたタイプを使用する方が良いでしょうか?

+0

いくつかの場所では 'TCar'を使用し、他の場所では' ICar'を使用します。それらの関係は何ですか(そして、StructureMapはそれらの関係について知っていますか?) –

+0

申し訳ありませんが、彼らは同じことです..タイプミス。 – GiddyUpHorsey

答えて

7

インスタンスをネストされたコンテナに挿入する場合は、そのインスタンスをネストされたコンテナから取得する必要があります。静的なObjectFactoryには独自のコンテナがあり、おそらくあなたのケースには「親」コンテナがあります。親コンテナは、ネストされたコンテナからインスタンスを継承しません。

コンストラクタ内でIEnumerableを受け入れるクラスにすべてのインスタンスを注入するために、特定の登録を行う必要はありません。 StructureMapはそれを自動的に行います。あなたのコンテナにICarのインスタンスが3つ登録されていて、FooのコンストラクタパラメータがIEnumerable<ICar>のコンテナからFooのインスタンスを要求すると、ICarの3つのインスタンスが挿入されたFooが作成されます。

+0

はい、ObjectFactoryには独自のコンテナがあり、注入された型が 'ObjectFactory.GetAllInstances ()'呼び出しには見えないようになったので、私はそのコード行を書き換えて注入されるようにする必要がありますタイプが表示されます。 – GiddyUpHorsey

+0

私は 'ForRequestedType >()を削除しようとしましたが、TheDefault.Is.ConstructedBy(x => ObjectFactory.GetAllInstances ());'行ですが、次の例外が発生します: 'StructureMap Exception Code:202デフォルトインスタンスが定義されていませんPluginFamily IEnumerable 'のために。あなたが言ったところでは、 'x.AddAllTypesOf ();'行がICarのすべてのインスタンスを登録し、IEnumerable パラメータが要求された型のコンストラクタに供給されると考えました。なぜそれがきちんと動作していないのでしょうか? – GiddyUpHorsey

+0

さて、私はこれが働いている。私は、StructureMapの最新バージョンを使用するようにプロジェクトを更新しなければなりませんでした。バージョン2.5.4は記述したとおりの動作をしませんが、2.6.1は動作します。私はまた 'ForRequestedType >()を削除しました.Default.Is.ConstructedBy(x => ObjectFactory.GetAllInstances ());'行は、入れ子になったコンテナから注入されたインスタンスを取得できました。 – GiddyUpHorsey

関連する問題