如何在2种不同情况下使用StructureMap获取泛型对象的实例?

| 我有以下界面
 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实例。 情况二 在运行时,我获得了一些已实现的IBuilder的类型(System.Type)(例如typeof(ConcreteABuilder)),并且需要获取匹配的构建器实例。在这种情况下,它必须返回ConcreteABuilder实例。 如何使用StructureMap的ObjectFactory解决Case1和Case2? 谢谢     
已邀请:
        我认为您要寻找的是通过以下方式注册您的类型:
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);
    
        在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 
    

要回复问题请先登录注册