使用structuremap获取和/或弹出通用接口的所有实现

时间:2013-11-08 14:12:13

标签: c# .net generics 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<>));

有谁知道如何获取通用接口的所有实例?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

如果你的目标是弹出它们,那么你可以使用以下代码:

ObjectFactory.Model.EjectAndRemovePluginTypes(x => 
    x.IsGenericType &&
    x.GetGenericTypeDefinition() == typeof(IHandle<>)
    );

可以获取所有实例,但您只能将其存储为System.Objectdynamic。你无法将它们转换为你尝试过的IHandle<ICommand>。这是不允许的,因为如果它类型安全就不能再保持。

BTW这不是ObjectFactory.GetAllInstances<IHandle<ICommand>>();返回零项的原因。这是因为根本没有注册插件类型IHandle<ICommand>的实例。您可能没有实现IHandle<ICommand>的类型,但您完全可以创建并注册它们并使用ObjectFactory.GetAllInstances<IHandle<ICommand>>()获取它们。

因此,如果System.Objectdynamic个实例正常,您可以执行以下操作:

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以获取动态方法。