2012-04-11 9 views
5

私たちは、アプリケーションのレイヤーを表す複数のプロジェクトがあるソリューションを持っています。例: あなたはコンテナへの参照を持っていないときにキャッスルウィンザープロパティの依存を解決することは可能ですか?

ドメイン

データ

ロジック

WebUIの

私たちの城ウィンザーコンテナは、当社のWeb層から参照され、我々はその後、私たちの層を介してこれらの依存関係をカスケード接続します。たとえば...

// In Domain 
public interface IFooRepository 
{ 
    void DoSomething(); 
} 

// In Data 
public class FooRepository : IFooRepository 
{ 
    public void DoSomething() 
    { 
     // Something is done 
    } 
} 

// In Logic 
public class MyThingManager 
{ 
    private readonly IFooRepository fooRepository; 

    public MyThingManager(IFooRepository fooRepository) 
    { 
     this.fooRepository = fooRepository; 
    } 

    public void AMethod() 
    { 
     this.fooRepository.DoSomething(); 
    } 

} 

// In Web 
// in some controller.... 
var newManager = new MyThingManager(WindsorContainer.Resolve<IFooRepository>()); 
newManager.DoSomething(); 

と私たちのマネージャーが自分の依存関係を持っているメンバーがたくさんあるまで、これはうまく動作します。このような状況が発生した場合、我々はマネージャの依存関係とその依存関係の不備を解決し、それらをウェブ層からカスケード化することになります。この結果はかなり大きいコンストラクタです。

たとえば、マネージャの内部コンポーネントがコンテナにアクセスすることなく自身の依存関係を解決するなど、より洗練された方法がありますか?

ウェブレイヤーだけがコンテナへのアクセス権を持っていることに注意してください(循環プロジェクトの依存性を防ぐため)、WebレイヤーのみがWindsorContainer.Resolve()ロジックレイヤーをアクティブにできるため、カスケード接続できませんコンテナ支援なしの依存関係は、Webレイヤーでそれを解決し、そのインターフェイスを使用してチェーンに渡すことでした。

+2

"私たちは、マネージャの依存関係とその依存関係の不備を解決し、それらをウェブ層からカスケードすることになります。"私はこれを理解していない。コンストラクタインジェクションを使用して、コンテナが自動的に依存関係を型のコンストラクタに挿入させるとき、何の問題もないはずです。この問題を視覚化するコードをさらに表示すると便利です。 – Steven

答えて

6

短い答えは、.Resolve<T>が表示されたら、おそらくdoing it wrongです。 @Stevenが述べたように、Windsorの組み込み機能を使用して、コンストラクタインジェクション(および/またはプロパティインジェクション)を提供したいとします。つまり、WindsorContainerはオブジェクトグラフのルートにあるオブジェクトを知る必要があります。

あなたの場合は、ルートオブジェクトに到達するまで、オブジェクトツリー(MyThingyManager)まで歩いて行きます。たとえば、ASP.NET MVCアプリケーションでは、これは呼び出されているアクションを含むコントローラになります。 MVC3の場合、すべての依存関係の注入を開始するにはDependencyResolverを使用します。

また、過去にWindsorに役立ったことは、コンポーネント(アセンブリ)ごとに異なるインストーラを使用することです。次に、これらのインストーラをアプリケーションをホストしているプロセスのベースに登録します。これはあなたの道を与え

var container = new WindsorContainer(); 
container.Install(FromAssembly.This()); 
container.Install(FromAssembly.Containing(typeof(ComponentThatContains.MyThingManager.Installer))); 

:あなたのようなものを持っているでしょうGlobal.asax.csのApplication_Startで

public class Installer : IWindsorInstaller 
{ 
     public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store) 
     { 
      container.Register(
       Component.For<IMyThingManager>().ImplementedBy<MyThingManager>(), 
       Component.For<IFooRepository>().ImplementedBy<FooRepository>() 
       ); 
     } 
} 

そして:

したがって、各コンポーネントにあなたのようなインストーラを持っているでしょうすべての依存関係をオブジェクトグラフ全体で管理し、コンストラクタインジェクションを介して解決します。 これが役立つことを願っています。

+0

これはありがとうございました。私はIOCのやり方を完全に再考しました。それは今や魔法のように機能します:D –

+0

うれしいことに、私は助けてくれるとうれしいです。 –

関連する問題