2016-04-13 16 views
5

StructureMap 2.6.4からStructureMap 3.1.6へのアップグレード後、ネストされたコンテナにあるジェネリックインターフェイスの登録が機能しなくなり、理由が見つかりませんなぜ彼らはもはや働かない。stucturemapのネストされたコンテナへのジェネリックインターフェイスと実装の登録

これは私が

StructureMap.StructureMapConfigurationException取得していますエラーです:いいえ、デフォルトのインスタンスが登録されていないと、自動的にタイプのために決定することができない「たITest < ExtendClass>」

ここではサンプルです

public class StructureMapContainerTests 
{ 
    [Test] 
    public void GlobalContainer() 
    { 
     var container = new Container(); 

     container.Configure(x => x.For(typeof(ITest<>)).Use(typeof(Test<>))); 

     var impl = container.GetInstance<ITest<ExtendClass>>(); 

     Debug.WriteLine(impl.Temp()); //Works 
    } 

    [Test] 
    public void NestedContainer() 
    { 
     var container = new Container(); 
     var nestedContainer = container.GetNestedContainer(); 

     nestedContainer.Configure(x => x.For(typeof(ITest<>)).Use(typeof(Test<>))); 

     var impl = nestedContainer.GetInstance<ITest<ExtendClass>>(); 

     Debug.WriteLine(impl.Temp()); //Doesn't work 
    } 
} 

public interface ITest<T> where T : BaseClass 
{ 
    string Temp(); 
} 

public class Test<T> : ITest<T> where T : ExtendClass 
{ 
    public string Temp() 
    { 
     return "OK: " + typeof(T); 
    } 
} 

public class BaseClass { } 

public class ExtendClass : BaseClass { } 

上記の両方のテストは、StructureMap 2.6で動作します。しかし、3.1.6では、ネストされたコンテナを使用する2番目のテストはもはや機能しません。

これが削除された機能であるか、間違って使用している場合は誰でも知っていますか? :)

答えて

0

私の経験では、StructureMapのネストされたコンテナ内にジェネリック型もデコレータも登録することはできません。

これを回避する方法は、レジストリを2つのレジストリに分割することです.1つはジェネリックとデコレータが親コンテナに登録され、もう1つは入れ子になっていないコンテナに登録された非ジェネリックインターフェイスです。残念ながら、これは拡張可能なシステムを構築するときに必ずしも容易ではありません。

ジェレミーがトバイアスに応答したのは、Google Groupsです。

入れ子のコンテナアーキテクチャは、3.0の完全な書き換えでした。正直言って、私はそれが2.6で働いたという事実は*ただの幸せな事故だと思う。今、ネストされたコンテナの登録のタイプがサポートされていません

...

ジェレミー・D. Miller氏

関連する問題