如何在两种不同的情况下使用StructureMap获取泛型对象的实例
本文关键字:StructureMap 获取 泛型 实例 对象 情况下 两种 | 更新日期: 2023-09-27 17:58:59
我有以下接口
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<>));
});
现在,我有两个
已编辑
我得到系统形式的类型(在这两种情况下)。类型
案例1
在运行时,我得到任何T类型(System.type)(例如typeof(ConcreteA),我需要得到匹配的构建器实例。在这种情况下,它必须返回ConcreteABuilder实例。
情况2
在运行时,我会得到一些已实现的IBuilder的类型(System.type)(例如typeof(ConcreteABuilder),我需要得到匹配的构建器实例。在这种情况下,它必须返回ConcreteABuilder实例。
如何使用StructureMap的ObjectFactory来解决Case1&案例2?
感谢
在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);