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();
    }
}

これが私の問題です。最初に実行される別のタスクに依存する 1 つのタスクがあります。InitializeDatabaseタスクの前に実行する必要があるタスクがありPopulateDatabseます。実行される他のタスクもたくさんありますInitializeDatabaseが、タイプの解決を注文できるキャッスル構成がある場合は、タスクを分割したくありません。解決されるタイプの完全な順序を指定したくありません。これは、自動登録の目的に反するためです。それがInitializeDatabase最初かPopulateDatabase最後かだけです。

すべての型の順序を指定せずに、どの型を最初に解決する必要があるかを登録する方法はありますか?

4

2 に答える 2

2

これを行う1つの方法は、あまりきれいではないかもしれませんが、機能します。

[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 に答える