Configuration Castle Windsor AllTypes中类型的有序解析

Configuration Castle Windsor AllTypes中类型的有序解析,configuration,dependency-injection,castle-windsor,Configuration,Dependency Injection,Castle Windsor,我有一组类,它们为我的应用程序启动活动实现了一个接口。这是注册码: private static void ConfigureContainer() { var container = new WindsorContainer(); container.Register(AllTypes.Of<IStartupTask>() .FromAssembly(Assembly.GetExecutingAssembly())) ...

我有一组类,它们为我的应用程序启动活动实现了一个接口。这是注册码:

private static void ConfigureContainer()
{
    var container = new WindsorContainer();

    container.Register(AllTypes.Of<IStartupTask>()
             .FromAssembly(Assembly.GetExecutingAssembly()))
    ...

    var serviceLocator = container.Resolve<IServiceLocator>();
    ServiceLocator.SetLocatorProvider(() => serviceLocator);
}
private static void ConfigureContainer()
{
var container=新的WindsorContainer();
container.Register(AllTypes.Of())
.FromAssembly(Assembly.getExecutionGassembly())
...
var serviceLocator=container.Resolve();
ServiceLocator.SetLocatorProvider(()=>ServiceLocator);
}
为了获得任务,我使用了这个,它按预期工作:

public static void Run()
{
    var tasks = ServiceLocator.Current.GetAllInstances<IStartupTask>();

    foreach (var task in tasks)
    {
       task.Execute();
    }
}
publicstaticvoidrun()
{
var tasks=ServiceLocator.Current.GetAllInstances();
foreach(任务中的var任务)
{
task.Execute();
}
}
这是我的问题:我有一个任务,它依赖于首先运行另一个任务。有一个
初始化数据库
任务需要在
填充数据库
任务之前运行。还有一堆其他正在运行的任务,如果有一些Castle配置允许我对类型的解析进行排序,我不希望将
InitializeDatabase
任务分割出去。我不想指定要解析的类型的完整顺序,因为这违背了自动注册的目的,只是
InitializeDatabase
是第一个或
PopulateDatabase
是最后一个


有没有一种方法可以在不指定所有类型的顺序的情况下注册哪些类型应该首先解析?

这里有一种方法可以做到这一点,它可能不是很漂亮,但它可以工作:

[AttributeUsage(AttributeTargets.Class)]
public class FirstAttribute: Attribute {}
public interface IService {}
public class ThirdService : IService { }
[First]
public class FirstService : IService { }
public class SecondService: IService {}

[Test]
public void WindsorOrder() {
    var container = new WindsorContainer();

    container.Register(AllTypes.Of<IService>()
        .FromAssembly(Assembly.GetExecutingAssembly()));

    var intf = container.ResolveAll<IService>()
        .OrderByDescending(i => i.GetType().GetCustomAttributes(typeof(FirstAttribute), true).Length)
        .ToArray();
    Assert.IsInstanceOfType(typeof(FirstService), intf[0]);
}
[AttributeUsage(AttributeTargets.Class)]
公共类FirstAttribute:属性{}
公共接口IService{}
公共类第三服务:IService{}
[第一]
公共类第一服务:IService{}
公共类第二服务:IService{}
[测试]
温莎秩序公众假期(){
var container=新的WindsorContainer();
container.Register(AllTypes.Of())
.FromAssembly(Assembly.getExecutionGassembly());
var intf=container.ResolveAll()
.OrderByDescending(i=>i.GetType().GetCustomAttributes(typeof(FirstAttribute),true).Length)
.ToArray();
Assert.IsInstanceOfType(typeof(FirstService),intf[0]);
}

如果从
FirstService
中删除
[First]
,则第一个将是
ThirdService
,测试将失败。

为此使用HandlerSelector

为什么要使用公共服务定位器?我正在尝试其他一些工具,但尚未取出它。我从我的代码中复制了这些片段,不想在问题中的Castle语法上犯错误。非常感谢你的回答,我来试试。谢谢你的指点。我看了看HandlerSelector,但我不知道如何在这个案例中使用它。IStarutTask的每个实现都会调用HandlerSelector.SelectHandler(),因此我不确定如何从那里订购服务解析。我使用HandleSelector错误吗?