[英]Getting and/or ejecting all implementations of a generic interface using structuremap
我目前有一个界面
public interface IHandle<T> where T : ICommand
{
void Invoke(T command);
}
在结构映射中,可以通过以下类型的调用获取IHandle的任何特定实现,因此我知道所有处理程序都存在于StructureMap中。
var commandHandler = ObjectFactory.GetInstance<IHandle<SomeCommand>>();
但是,我想做的就是获取(或弹出,这就是我的最终目标)如果有IHandle的所有实例。
我尝试了以下失败的尝试
// compile error because it doesn't have a type
ObjectFactory.GetAllInstances<IHandle<>>();
// returns 0 items
ObjectFactory.GetAllInstances<IHandle<ICommand>>();
// has runtime error of "Cannot create arrays of open type."
ObjectFactory.GetAllInstances(typeof(IHandle<>));
有谁知道如何获取通用接口的所有实例?
谢谢你的帮助
如果您的目标是弹出它们,则可以使用以下代码:
ObjectFactory.Model.EjectAndRemovePluginTypes(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IHandle<>)
);
可以获取所有实例,但是您只能将它们存储为System.Object
或dynamic
。 您不能将它们IHandle<ICommand>
为您尝试过的IHandle<ICommand>
。 不允许这样做,因为如果可以键入,将无法再保持安全性。
顺便说一句,这不是ObjectFactory.GetAllInstances<IHandle<ICommand>>();
的原因ObjectFactory.GetAllInstances<IHandle<ICommand>>();
返回零项。 这是因为根本没有注册插件类型IHandle<ICommand>
实例。 您可能没有实现IHandle<ICommand>
类型,但是可以完美地创建和注册它们,并使用ObjectFactory.GetAllInstances<IHandle<ICommand>>()
获取它们。
因此,如果可以使用System.Object
或dynamic
实例,则可以执行以下操作:
IEnumerable<IPluginTypeConfiguration> handlers =
ObjectFactory.Model.PluginTypes
.Where(x => x.PluginType.IsGenericType &&
x.PluginType.GetGenericTypeDefinition() ==
typeof (IHandle<>));
var allInstances = new List<object>();
foreach (IPluginTypeConfiguration pluginTypeConfiguration in handlers)
{
var instancesForPluginType =
ObjectFactory.GetAllInstances(pluginTypeConfiguration.PluginType)
.OfType<object>();
allInstances.AddRange(instancesForPluginType);
}
更改object
以dynamic
的动态方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.