5

今では MVP パターンを完全に理解していますが、ビューとプレゼンターがインスタンス化されている場所を確認するのにまだ苦労しています。ビューでプレゼンターが新しくなる例をいくつか見ましたが、これは正しいですか。ビューとプレゼンター間の通信に関する Jeremy Miller のブログ投稿を読んだ後、プレゼンターをビューにアタッチする関数をプレゼンターに追加しました。

私の質問は次のとおりです。ビューとプレゼンターはどこで作成する必要がありますか? また、winforms と webforms のどこにあります。

4

3 に答える 3

3

Web フォームでは、ページはリクエストによってインスタンス化されます。ページはビューであり、実行の順序を制御できないため、ビュー自体をプレゼンターに登録する必要があります

于 2008-12-09T22:15:08.730 に答える
2

Winforms では、必要に応じてビューをインスタンス化します (たとえば、mainメソッド内、または別のプレゼンターのメソッド内など、実際に意味のある場所であればどこでも)。次に、ビューはプレゼンターの新しいインスタンスを作成して登録します。

これにより、複数のビューで同じプレゼンター ロジックを簡単に使用できるようになり、ビューのユーザーは、MVP を使用するという特定のアーキテクチャ上の決定から保護されます。

于 2008-12-09T22:28:05.677 に答える
1

まず良い質問です。第二に、それは大した問題ではないかもしれません。私の個人的な好みは、ほとんどの場合、Presenter と View を View に接続することです。

このシナリオを比較してください。

public class SomePresenter
{
    public ShowContactView(IContactView view)
    {
        IContact model = new Contact();
        new ContactPresenter(model, view);
        view.Show();
    }
} 

public class AnotherPresenter
{
    public ShowContactView(IContactView view)
    {
        IContact model = new Contact();
        new ContactPresenter(model, view);
        view.Show();
    }
} 

public class YetAnotherPresenter
{
    public ShowContactView(IContactView view)
    {
        IContact model = new Contact();
        new ContactPresenter(model, view);
        view.Show();
    }
} 

public partial class ContactView : Form, IContactView
{    
    public ContactView()
    {
        InitializeComponent();
    }
}

これに:

public class SomePresenter
{
    public ShowContactView(IContactView view)
    {
        view.Show();
    }
} 

public class AnotherPresenter
{
    public ShowContactView(IContactView view)
    {
        view.Show();
    }
} 

public class YetAnotherPresenter
{
    public ShowContactView(IContactView view)
    {
        view.Show();
    }
} 

public partial class ContactView : Form, IContactView
{    
    public ContactView()
    {
        InitializeComponent();

        new ContactPresenter(new Contact(), this);
    }
}

後者の方がコードの重複がはるかに少ないことがわかります。もちろん、それはばかげた重複です。または、共通の機能を共有機能に移動できると言うことができますが、それは単なる例にすぎません。その場合、アプリケーションの複数の部分で同じビューをインスタンス化する必要があります。

さらに、Presenter を認識している View の利点は、View プロジェクトで Presenter を参照するだけでよいため、異なる UI アプリケーションで同じ Presenter を再利用できることです。そうしないと、Presenter ですべての View プロジェクトを参照する必要があります。

しかし、より重要なことは、さまざまなモデルが自分のケースにどのように適合するかを確認することです. 正直なところ、さらに多くの可能性があります。この重複した質問を参照してください。

于 2013-01-17T23:15:05.757 に答える