繁体   English   中英

如何使用具有 2 种不同情况的 StructureMap 获取通用 object 的实例?

[英]How to get instance of generic object using StructureMap with 2 different cases?

我有以下界面

 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实例。

案例2

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

如何使用 StructureMap 的 ObjectFactory 解决 Case1 & Case2?

谢谢

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM