如何使用StructureMap获取通用对象的实例,有两种不同的情况?

时间:2011-06-13 21:58:40

标签: c# 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个案例

EDITED

我以 System.Type

的形式获取类型(在两种情况下)

案例1

在运行时我得到任何 T 类型( System.Type )(例如 typeof(ConcreteA))并且我需要获得匹配构建器实例。在这种情况下,它必须返回 ConcreteABuilder 实例。

案例2

在运行时,我得到一些实现的IBuilder的类型( System.Type )(例如 typeof(ConcreteABuilder)),我需要获取匹配的构建器实例。在这种情况下,它必须返回 ConcreteABuilder 实例。

如何使用StructureMap的ObjectFactory来解决Case1&amp;情况2?

谢谢

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);