[英]How to get instance of generic object using StructureMap with 2 different cases?
我有以下界面
public interface IBuilder<T>
{
T Create(string param);
}
有许多实现上述接口的类。 其中之一是:
public class ConcreteABuilder : IBuilder<ConcreteA>
{
public ConcreteA Create(string param)
{
return new ConcreteA();
}
}
我正在使用 StructureMap 注册所有实现IBuilder<>
的类
Scan(x =>
{
x.TheCallingAssembly();
x.AddAllTypesOf(typeof(IBuilder<>));
});
现在,我有2个案例
已编辑
我以System.Type的形式获得类型(在两种情况下)
情况1
在运行时我得到任何T类型( System.Type )(例如typeof(ConcreteA) ),我需要得到匹配的构建器实例。 在这种情况下,它必须返回ConcreteABuilder实例。
案例2
在运行时,我得到了一些实现的 IBuilder 的类型( System.Type )(例如typeof(ConcreteABuilder) ),我需要得到匹配的构建器实例。 在这种情况下,它必须返回ConcreteABuilder实例。
如何使用 StructureMap 的 ObjectFactory 解决 Case1 & Case2?
谢谢
在 StructureMap 配置中使用它
x.ConnectImplementationsToTypesClosing(typeof(IBuilder<>))
现在在运行时解析泛型类型
Type openType = typeof(IBuilder<>);//generic open type
var type = openType.MakeGenericType(modelType);//modelType is your runtime type
var builder = StructureMap.ObjectFactory.Container.GetInstance(type);//should get your ConcreteABuilder
我认为您正在寻找的是注册您的类型:
x.ConnectImplementationsToTypesClosing(typeof(IBuilder<>))
然后向容器询问IBuilder<ConcreteA>
或ConcreteABuilder
将返回一个ConcreteABuilder
...现在的问题是,由于您直到运行时才知道类型(由用户选择或其他什么?),您只能使用非通用版本:
object someBuilder = ObjectFactory.GetInstance(thePassedInTypeAtRuntime);
... then use reflection to invoke the createMethod
或者
dynamic someBuilder = (dynamic)ObjectFactory.GetInstance(thePassedInTypeAtRuntime);
....
在某个地方,您实际上知道您正在要求一个可以返回 ConcreteA 的 IBuilder
ConcreteA myA = someBuilder.Create(someParams);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.