StructureMap打开通用

时间:2012-06-27 14:10:23

标签: c# generics structuremap

我有一种情况需要从开放的通用基类中获取一个具体的类。

我的班级层次结构:

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找到名为“Class2”的实例TestStructureMapGeneric.OpenGenericBaseClass`1

如何获得我的c2命名具体实例?

感谢您的帮助。

1 个答案:

答案 0 :(得分: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