6

ウィンザーコンテナを使用して次の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自体に何か問題がありますか?

4

2 に答える 2

4

この問題にはいくつかの解決策がありますが、それらはすべて、コンストラクターの依存関係からプレゼンターまたはビューのいずれかを削除することにより、依存関係のサイクルを壊します。

最も簡単な解決策は、ビューをプレゼンターのプロパティとして導入することです。

// Presenter
ConcretePresenter(IModel model)
{
    this.model = model;
}

public IView View { get; set; }

// View
ConcreteView(ConcretePresenter presenter)
{
    this.presenter = presenter;
    this.presenter.View = this;
}

これの欠点は、ビューに挿入されるときに各プレゼンターを構成する必要があるため、これを基本クラスに移動することもできます。

// View
ConcreteView(ConcretePresenter presenter) : base(presenter)
{
}

BaseView(IPresenter presenter)
{
    Contract.Requires(presenter != null);
    presenter.View = this;
    this.Presenter = presenter;
}

別のオプションは、プレゼンターファクトリをビューに挿入し、そこから要求することです。

// View
ConcreteView(IPresenterFactory factory)
{
    this.presenter = factory.CreatePresenterFor(this);
}

欠点は、このコンストラクターがファクトリを呼び出すことです。これは、実行するのに最もクリーンなことではありませんが、管理しやすいものです。

于 2012-12-21T11:26:39.497 に答える
0

プレゼンターをインスタンス化するためのファクトリを作成します。ビュー(WinForm)は、コンストラクターのファクトリを使用します。おそらく、型付きファクトリファシリティを使用できます。つまり、プレゼンターファクトリのインターフェイスを定義し、ファシリティに残りの作業を任せるだけで済みます。

于 2012-12-20T21:46:59.203 に答える