我有一种情况需要从开放的通用基类中获取一个具体的类。
我的班级层次结构:
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命名具体实例?
感谢您的帮助。
答案 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