开放通用类型的StructureMap GetAllInstances

时间:2015-03-12 07:36:01

标签: structuremap structuremap3

我是StructureMap的新手并尝试了一个简单的场景

我扫描基础文件夹中的所有程序集,并查找实现我的开放通用接口的类型。

Scan(
    scan => {
        scan.AssembliesFromApplicationBaseDirectory();
        scan.AddAllTypesOf(typeof(IHandler<>));
    });

这可行,我可以看到它注册所有这些类型,但是当获得所有类型的列表时,我面临的问题是下面的语句返回null。

var list = container.GetAllInstances(typeof(IHandler<>));

但是,我可以使用具体类型名称获取类型而没有任何问题

var obj = container.GetInstance(typeof(IHandler<ConcreteHandler>));

所以我想得到的是实现IHandler&lt;&gt;的所有类型的列表因为我不知道具体的类型名称,稍后在每个对象上调用一个接口方法来找出要使用的正确对象。

不确定是否可能,但更好的是,如果StructureMap允许我调用接口方法并仅获取那些返回的类型,例如方法调用的结果为true。

谢谢, 周杰伦。

1 个答案:

答案 0 :(得分:4)

不确定你想要完成什么,所以我只会参考这一部分:

  

所以我想要的是一个实现IHandler&lt;&gt;

的所有类型的列表

您可以访问容器的元数据并查询实现您的开放泛型类型的所有实例,如下所示:

var handlerTypes =
                container.Model.AllInstances.Where(
                    i =>
                    i.PluginType.IsGenericType && i.PluginType.GetGenericTypeDefinition() == typeof(IHandler<>))
                    .Select(m => m.ConcreteType)
                    .ToArray();