2011-03-07 3 views
2

私はキャッスル・ウィンザーの初心者です。のは、私は以下のクラスがあるとしましょう:キャッスル・カスタスト・ライフ・スタイル/決議

public class LowLevelComponent 
{ 
} 

public class HighLevelComponent 
{ 
    readonly LowLevelComponent LowLevelComponent; 

    public HighLevelComponent(LowLevelComponent lowLevelComponent) 
    { 
     LowLevelComponent = lowLevelComponent; 
    } 
} 

public class ComponentBeingResolved 
{ 
    readonly LowLevelComponent LowLevelComponent; 
    readonly HighLevelComponent HighLevelComponent; 

    public ComponentBeingResolved(LowLevelComponent lowLevelComponent, 
            HighLevelComponent highLevelComponent) 
    { 
     LowLevelComponent = lowLevelComponent; 
     HighLevelComponent = highLevelComponent; 
    } 
} 

最も簡単な可能な方法で登録:

container.Register(Component.For<LowLevelComponent>()); 
container.Register(Component.For<HighLevelComponent>()); 
container.Register(Component.For<ComponentBeingResolved>()); 

私はすべての依存関係に私が呼ぶたびに使用LowLevelComponentの同じインスタンスを取得したいのですが解決を解決してください。

ので、これらの呼び出し後:

var instance1 = container.Resolve<ComponentBeingResolved>(); 
var instance2 = container.Resolve<ComponentBeingResolved>(); 

次の主張は真実でなければなりません:

instance1.LowLevelComponent == instance1.HighLevelComponent.LowLevelComponent 
instance1.LowLevelComponent != instance2.LowLevelComponent 
instance1.HighLevelComponent != instance2.HighLevelComponent 

私もこれは何ですか、あなたはすべて間違ってやっている」を取りますよ代わりに「」と答えてください:-)

+1

[Castle Windsor DIコンテナと同じコンテキストで一時的な依存関係を再利用する方法](http://stackoverflow.com/questions/3986747/how-to-reuse-a-transient-dependency-in-same -context-with-castle-windsor-di-contai) –

+1

この問題と同じ問題は、Germánのコンテキストライフスタイルをチェックしてください:http://blog.schuager.com/2010/11/contextual-lifestyle-reloaded.html –

+0

@MauricioScheffer :私が必要とするものとまったく同じように見えます!しかし、手動でスコープを作成しないようにする方法はありますか?たとえば、型付きの工場ファシリティを使用している場合... –

答えて

0

は、私はそれが工場を使用して作業しました:

public interface IComponentFactory 
{ 
    T Get<T>(); 
} 

var container = new WindsorContainer(); 
container.AddFacility<TypedFactoryFacility>(); 
container.Register(Component.For<LowLevelComponent>() 
     .LifeStyle.Custom<ContextualLifestyle>()); 
container.Register(Component.For<HighLevelComponent>() 
     .LifeStyle.Custom<ContextualLifestyle>()); 
container.Register(Component.For<IComponentFactory>().AsFactory()); 
//Register the "context-root" component in a child container 
var subContainer = new WindsorContainer(); 
subContainer.Register(Component.For<ComponentBeingResolved>() 
      .LifeStyle.Transient); 
container.AddChildContainer(subContainer); 
container.Register(
    Component.For<ComponentBeingResolved>() 
     .LifeStyle.Transient 
     //Here's the magic 
     .UsingFactoryMethod(
      () => 
       { 
        using (new ContainerContext(container)) 
         return subContainer.Resolve<ComponentBeingResolved>(); 
       })); 

は使用方法:これは良いハックや醜いものですが、それは見事に動作するかどうか

var factory = container.Resolve<IComponentFactory>(); 
var instance1 = factory.Get<ComponentBeingResolved>(); 
var instance2 = factory.Get<ComponentBeingResolved>(); 

わかりません。

+0

は子コンテナに必要ですか? –

+0

@MauricioScheffer:カーネル/コンテナで直接Resolveを呼び出すと、スタックオーバーフローを避けるために見つけた方法です –

0

あなたはResと呼ぶだけの人がいるはずですolive あなたのアプリエントリポイント(メイン、コントローラなど)。城のドキュメントはこれに良いguidelinesしています。マウリシオのリンクに基づいて

+0

はい、私はその記事を読んできました。型付きのファクトリを使用して 'ComponentBeingResolved'を取得できたと思いますが、問題は解決しません。 –

関連する問題