0

オープン ジェネリック基本クラスから具体的なクラスを名前で取得する必要がある状況があります。

私のクラス階層:

public class Foo { }

public class Bar { }

public abstract class OpenGenericBaseClass<T> where T : class { }

public class ConcreteClass1 : OpenGenericBaseClass<Foo> { }

public class ConcreteClass2 : OpenGenericBaseClass<Bar> { }

私のレジストリコード:

For(typeof(OpenGenericBaseClass<>)).Use(x => x.GetInstance<ConcreteClass1>());

For(typeof(OpenGenericBaseClass<>)).Add(x => x.GetInstance<ConcreteClass2>()).Named("Class2");

私のプログラムコード:

 ObjectFactory.Configure(
            x => x.Configure(
                a => a.Scan(
                    b =>
                    {
                        b.AssembliesFromApplicationBaseDirectory();
                        b.LookForRegistries();
                    })));

        var c1 = ObjectFactory.GetInstance(typeof(OpenGenericBaseClass<>));

        var c2 = ObjectFactory.GetNamedInstance(typeof(OpenGenericBaseClass<>), "Class2");

GetInstance メソッド (c1 用) への最初の呼び出しは、適切な「ConcreteClass1」オブジェクトを返します。ただし、2 回目の呼び出し (c2 の場合) では例外が発生します: StructureMap Exception Code: 200 Could not find an Instance named "Class2" for PluginType TestStructureMapGeneric.OpenGenericBaseClass`1

c2 という名前の具体的なインスタンスを取得するにはどうすればよいですか?

ご協力いただきありがとうございます。

4

1 に答える 1

0

StructureMapは、ジェネリック型を開くための名前付き構成の追加をサポートしていないようです。しかし、なぜオープンジェネリック型が必要なのですか?オープンジェネリック型はStructureMapで使用され、ジェネリック引数をあるクラスから別のクラスに転送します。そのためFor(typeof(OpenGenericBaseClass<>)).Use(typeof(ConcreteClass1))、例外を取得せずにコンストラクトを使用することはできず、ラムダを使用する必要があります。

この特定の例では、オープンジェネリック型を使用せずに基本クラスを追加するだけで型を解決できます。

 public abstract class BaseClass {}
 public abstract class OpenGenericBaseClass<T> : BaseClass where T : class {}

そして、次のレジストリコードを使用します。

 For<BaseClass>().Use<ConcreteClass1>();
 For<BaseClass>().Add<ConcreteClass2>().Named("Class2");

今、私はこのコードでインスタンスを簡単に解決することができます:

 var c1 = ObjectFactory.GetInstance<BaseClass>(); // of type ConcreteClass1
 var c2 = ObjectFactory.GetNamedInstance<BaseClass>("Class2"); // of type ConcreteClass2
于 2012-06-27T18:12:38.253 に答える