我有以下界面
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个案例
EDITED
我以 System.Type
的形式获取类型(在两种情况下)案例1
在运行时我得到任何 T 类型( System.Type )(例如 typeof(ConcreteA))并且我需要获得匹配构建器实例。在这种情况下,它必须返回 ConcreteABuilder 实例。
案例2
在运行时,我得到一些实现的IBuilder的类型( System.Type )(例如 typeof(ConcreteABuilder)),我需要获取匹配的构建器实例。在这种情况下,它必须返回 ConcreteABuilder 实例。
如何使用StructureMap的ObjectFactory来解决Case1&amp;情况2?
谢谢
答案 0 :(得分: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
答案 1 :(得分:1)
我认为您正在寻找的是使用以下方式注册您的类型:
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);