2011-07-01 16 views
2

この例では、IServiceLocatorを使用してコンテナをラップするのにベストプラクティスを使用していませんが、少し難解です。WindsorContainerがIWindsorContainerを解決できないのはなぜですか?

私はWindsorContainerが自動的にIWindsorContainerとして解決できると思いましたか? INeedWindsorContainerの

var container = new WindsorContainer(); 

container.Register(Component.For<INeedWindsorContainer>() 
    .ImplementedBy<GiveMeWindsorContainer>() 
    .LifeStyle.Singleton); 

実装:WindsorContainerはIWindsorContainerを解決する方法を知らないので、

public class GiveMeWindsorContainer : INeedWindsorContainer 
{ 
    IWindsorContainer _container; 

    public GiveMeWindsorContainer(IWindsorContainer container) 
    { 
     _container = container; 
    } 
} 

しかしこれは、動作しませんでした!

もちろん

私が思いついたとした迅速な解決策:

var container = new WindsorContainer(); 

container.Register(
    Component.For<IWindsorContainer>() 
     .Instance(container) 
     .LifeStyle.Singleton, 
    Component.For<INeedWindsorContainer>() 
     .ImplementedBy<GiveMeWindsorContainer>() 
     .LifeStyle.Singleton); 

しかし、これは私には少し奇妙に思えるが、私が何か間違ったことをやっていますか?

答えて

6

Windsorは自動的にIKernel(あなたが必要とするほとんどの機能を持つコンテナコア)を解決できます。

あなた自身が言ったように、一般的にコンテナ自体を渡すのは良い方法ではありません。ほとんどの場合、おそらく型付きの工場施設を通して工場を使うべきです。

関連する問題