1

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

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

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

    var serviceLocator = container.Resolve<IServiceLocator>();
    ServiceLocator.SetLocatorProvider(() => serviceLocator);
}

为了获得任务,我使用它并且它按预期工作:

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

    foreach (var task in tasks)
    {
       task.Execute();
    }
}

这是我的问题:我有一个任务取决于另一个任务首先运行。有一个InitializeDatabase任务需要在PopulateDatabse任务之前运行。还有一堆其他任务正在运行InitializeDatabase,如果有一些 Castle 配置允许我订购类型的分辨率,我宁愿不将任务拆分出来。我不想指定正在解析的类型的完整顺序,因为这违背了自动注册的目的,只是InitializeDatabase第一个或PopulateDatabase最后一个。

有没有办法注册哪些类型应该首先解析而不指定所有类型的顺序?

4

2 回答 2

2

这是一种方法,它可能不是很漂亮,但它有效:

[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]);
}

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

于 2009-05-09T01:53:46.923 回答
0

为此使用 HandlerSelector

于 2009-05-11T11:37:29.360 回答