我是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。
谢谢, 周杰伦。
答案 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();