2

我是 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 的类型,那就更好了。

谢谢,杰。

4

1 回答 1

4

不确定您要完成什么,因此我将仅参考这一部分:

所以我想要得到的是实现 IHandler<> 的所有类型的列表

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

var handlerTypes =
                container.Model.AllInstances.Where(
                    i =>
                    i.PluginType.IsGenericType && i.PluginType.GetGenericTypeDefinition() == typeof(IHandler<>))
                    .Select(m => m.ConcreteType)
                    .ToArray();
于 2015-03-12T10:55:06.517 回答