2011-08-18 27 views
6

これは城ではまっすぐ進むかもしれないと思うが、私はこの技術を初めて使い、何時間もグーグルで運がない!登録時にコンポーネントをシングルトンとしてインスタンス化するにはどうすればよいですか?

私は次があります。

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

私は実際に城を尋ねるまで、今はかなり当然これは遅延ロードされ、実行されていないUsingFactoryMethod()に渡されたラムダ式、つまり私にされて解決することですクラスのインスタンス

しかし、私が登録したらすぐにキャッスルにインスタンスを作成させていただきたいと思います。これは可能ですか?あなただけregister an existing instanceことができ、この単純なケースでは

答えて

8

あなただけそうのように構築されて始動可能施設使用することができます:あなたは

hereそれについてを読むことができます

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

7

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

ありがとうございます!ここでは、私が使用し終わったものがあります - container.Register(Component.For ()。Instance(new MySpecialClass())); – jameskind

+1

これは、インスタンス化をコンテナに残さず、したがってIoCパターンを破棄しないため、最良のアプローチのようには見えません。 –

+0

@DavidPerlman私がこの答えを書いたとき、MosheLeviの最近の答えがそう簡単にはないと思います。 –

1

「インスタンス」を使用して再答えは常に可能ではないかもしれない(クラスが依存関係自体の層を持っている場合、それは新しいに容易ではないだろうそれ)。その場合 、少なくともウィンザー2.5で、これを使用することができます

public static void ForceCreationOfSingletons(this IWindsorContainer container) 
    { 
     var singletons = 
      container.Kernel.GetAssignableHandlers(typeof (object)) 
        .Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton); 

     foreach (var handler in singletons) 
     { 
      container.Resolve(handler.ComponentModel.Service); 
     } 
    } 

    // usage container.ForceCreationOfSingletons(); 
関連する問題