アプリケーションのレイヤーを表す複数のプロジェクトを持つソリューションがあります。例えば
ドメイン
データ
論理
WebUI
Castle Windsor コンテナーは 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 レイヤーからそれらをカスケードすることになります。この結果は、いくつかのかなり大きなコンストラクタです。
たとえば、マネージャーの内部コンポーネントがコンテナーにアクセスせずに独自の依存関係を解決するなど、より洗練された方法はありますか?
Web レイヤーのみがコンテナーにアクセスできることに注意してください (循環プロジェクトの依存関係を防ぐため)。したがって、アクティブに WindsorContainer.Resolve() できるのは Web レイヤーのみであり、ロジック レイヤーはできないため、依存関係をカスケードする唯一の方法は、コンテナーの支援は、Web レイヤーでそれを解決し、そのインターフェイスを使用してチェーンに渡すことでした。