代码之家  ›  专栏  ›  技术社区  ›  Jay

打开泛型类型上的StructureMap GetAllInstance

  •  2
  • Jay  · 技术社区  · 10 年前

    我刚接触StructureMap,正在尝试一个简单的场景

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

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

    这是有效的,我可以看到它注册了所有这样的类型,但当涉及到获取所有类型的列表时,我面临以下语句返回null的问题。

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

    但是,我可以使用具体的类型名获得类型,而不会有任何问题

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

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

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

    谢谢 松鸦。

    1 回复  |  直到 10 年前
        1
  •  4
  •   LetMeCodeThis    10 年前

    不知道你想完成什么,所以我只参考这一部分:

    所以我想得到的是实现IHandler<>

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

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