ウィンザーコンテナを使用して次のMVPデザイン(winforms用)を作成するときに、循環依存の問題に直面しています。
私のプレゼンターは、ビューとモデルによって異なります。
ConcretePresenter(IView view, IModel model)
{
this.view = view;
this.model = model;
}
私の見解はプレゼンターによって異なります。
ConcreteView(ConcretePresenter presenter)
{
//actual requirement that the presenter use the current instance of the view and a model object
//new presenter(this, new model())
this.presenter = presenter;
}
ウィンザー城(別のコンポジションルートクラス)を使用して、すべてのコンポーネントを次のように登録しています。
IWindsorContainer container;
container = new WindsorContainer();
container.Register(Component.For<ConcretePresenter>().ImplementedBy<ConcretePresenter>());
container.Register(Component.For<IModel>().ImplementedBy<ConcreteModel>());
container.Register(Component.For<IView>().ImplementedBy<ConcreteView>());
ビューを解決すると、循環参照の問題が発生します。
container.Resolve<ConcreteView>(); //doesn't resolve because of cyclic dependency
考えられる解決策は、ビューからコンストラクタインジェクションを削除し、プレゼンターを個別に解決することです。 しかし、これにより、私が意図していなかった2つの場所でコンテナーを使用することになり、おそらく間違っています。
ConcreteView()
{
container.Resolve<ConcretePresenter>(); //resolving at 2 different points
}
これに対するより良い解決策はありますか?MVP自体に何か問題がありますか?