2009-05-08 9 views
1

私は、アプリケーション起動のためのインターフェースを実装するクラスのグループを持っています。ここで登録コードは次のとおりです。Castle Windsor AllTypesのタイプの整理された解決方法

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

は私の問題です:私は別であることに依存して一つのタスクを持っています最初に実行します。 PopulateDatabseタスクの前に実行する必要があるInitializeDatabaseタスクがあります。実行されている他のタスクもたくさんあります。タイプの解像度を注文するためのCastle設定がある場合は、InitializeDatabaseタスクを分割しないでください。私はタイプの完全な順序を指定したくないので、自動登録の目的を破るので、InitializeDatabaseが最初であるか、PopulateDatabaseが最後です。

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

+0

なぜ共通サービスロケータを使用していますか? –

+0

私はいくつかのツールを試していましたが、まだ取り上げていません。私は自分のコードからスニペットをコピーし、質問の中で城の構文を誤解したくはありませんでした。 お返事ありがとうございます、私は試してみましょう。 –

答えて

2

はここでそれを行うための一つの方法だ、それは非常にきれいではないかもしれませんが、それは動作します:あなたがFirstServiceから[First]を削除する場合は、最初はThirdServiceになり、テストは失敗します

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

0

ハンドラセレクタを使用する

+0

ポインタありがとう。私はHandlerSelectorを見ましたが、私はこのケースでどのように使用できるのか分かりませんでした。 HandlerSelector.SelectHandler()はIStartupTaskの実装ごとに呼び出されるため、ここからサービスの解像度をどのように注文するかはわかりません。私はHandleSelectorを間違って使用していますか? –

関連する問題