在温莎城堡致电ResolveAll时订购

Sag*_*tay 5 c# castle-windsor dependency-resolver

假设我在容器中注册了多个对象,都实现了相同的接口:

container.Register(
    Component.For<ITask>().ImplementedBy<Task1>(),
    Component.For<ITask>().ImplementedBy<Task2>(),
    Component.For<ITask>().ImplementedBy<Task3>(),
    Component.For<ITask>().ImplementedBy<Task4>(),
);
Run Code Online (Sandbox Code Playgroud)

我希望解决ITask的所有实现:

var tasks = container.ResolveAll<ITask>();
Run Code Online (Sandbox Code Playgroud)

有没有办法控制已解析实例的顺序?

注意:显然,我可以在ITask上实现一个OrderPriority属性,只是对任务列表进行排序,但我正在寻找一个更低级别的解决方案.

Leo*_*Leo 6

我相信你正在寻找的是一个Handler过滤器,它基于稀少的文档和Windsor Castle 3中的重大变化; 它提供组件的过滤和排序.这是他们的Wiki页面的摘录

该接口类似于IHandlerSelector,但允许您过滤/排序container.ResolveAll()方法请求的处理程序

所以基本上你需要实现IHandlerFilter接口,然后在初始化Windsor容器时将这个实现添加到内核中.从源代码中,这个界面看起来与此类似......

public interface IHandlerFilter
{
    bool HasOpinionAbout(Type service);
    IHandler[] SelectHandlers(Type service, IHandler[] handlers);
}
Run Code Online (Sandbox Code Playgroud)

处理程序过滤器添加到内核​​将如下所示......

 var container = new WindsorContainer()
        .Install(Configuration.FromXmlFile("components.config"));
        container.Kernel.AddHandlersFilter(new YourHandlerFilterImplementation());
Run Code Online (Sandbox Code Playgroud)

然后,当ResolveAll根据您自己的实现对订单的服务的所有组件进行解析时,将对其进行排序(和过滤)