如何在两种不同的情况下使用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获取泛型对象的实例

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