Castle Windsor ResolveAll使用多个组件中的键

时间:2016-06-16 17:48:52

标签: c# dependency-injection castle-windsor

有没有办法使用密钥解析给定服务的所有类型,并且该密钥被多次使用?这不适用于依赖注入。 我想要实现的是组件组件,并获取组中这些组件的列表 例如,我有一个界面:

interface ICommand  
{  
   void Execute();  
}  

我想将此接口用于多个目的,每个目的可能有多个实现,我不想为每个目的创建一个接口,我想使用这个ICommand接口。
我希望能够做到以下的事情:

ICommand[] commands = container.ResolveAll<ICommand>("purpose1");  
ICommand[] commands2 = container.ResolveAll<ICommand>("purpose2");  

以上假设已经进行了注册。 有没有人知道如何做到这一点?
我知道Castle Windsor是为了做依赖注入,但我发现它有助于实现这个目的,我知道这可以自然地使用MEF完成,但是一些组件确实有依赖性MEF我知道它不会注入。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我认为给出一个关键名称是为了区别于容器下的同一服务的多个实现。

您可以在服务中定义一个属性,该属性可以包含实现所属组的名称。

使用UnityContainer,您可以执行以下操作:

interface ICommand  
{  
   void Execute();
   string GroupName { get; }
} 

class CommandImpl1 : ICommand 
{
  void Execute() { ... }
  string GroupName { get { return "group1"; }
}

class CommandImpl2 : ICommand 
{
  void Execute() { ... }
  string GroupName { get { return "group1"; }
}

然后你可以注册:

Container.Register<ICommand, CommandImpl1>("a");
Container.Register<ICommand, CommandImpl2>("b");

全力以赴寻找您正在寻找的群体:

IEnumerable<ICommand> allCommands = Container.ResolveAll<ICommand>();
IEnumerable<ICommand> group1Commands = allCommands
    .Where( cmds => cmds.GroupName.Equals("group1"));

没有测试它,但它认为应该工作。另一种方法可能是在已实现的服务中使用注释。

干杯!!