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”对象。但是对于第二次调用(对于 c2),我得到一个异常: StructureMap 异常代码:200 找不到 PluginType TestStructureMapGeneric.OpenGenericBaseClass`1 的名为“Class2”的实例

我怎样才能得到我的 c2 命名的具体实例?

谢谢你的帮助。

4

1 回答 1

0

似乎 StructureMap 不支持添加命名配置来打开泛型类型。但是,为什么需要一个开放的泛型类型?在 StructureMap 中使用开放泛型类型将泛型参数从一个类传输到另一个类,这就是为什么您不能在For(typeof(OpenGenericBaseClass<>)).Use(typeof(ConcreteClass1))没有异常的情况下使用该构造而必须使用 lambda。

对于这个特定的例子,我可以通过添加一个基类而不使用开放的泛型类型来解析类型:

 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 回答