9

アプリを開発する上で大きな問題に取り組んでいます。これは、Model-View-Presenter パターンを実装する C# 上の Winforms ベース アプリケーションですが、私はこの方法は初めてです。私はどこでも検索しましたが、私の問題に対する答えが見つかりませんでした。

このパターンを使用して winform 間の通信を可能にする方法と、プレゼンターをフォームに結合せずにプレゼンターがそれらを表示する方法を知る必要があります。Factory パターンを使用する方法を見てきましたが、その実装方法がわかりません。

正しい方向への助けや指摘をいただければ幸いです。

4

4 に答える 4

3

アサーション

プレゼンターは、ビューとモデルの間の調整を担当します(パッシブビューの実装に従う場合)。

これは次のようになります。

プレゼンターをインスタンス化し、プレゼンターに自分自身を挿入するビュー:

IPresenter presenter;
public View() { presenter = new Presenter(this) }

1つ以上のビューをインスタンス化し、ビューに自分自身を挿入するプレゼンター:

IView1 view1;
public Presenter() { view1 = new View1(this) } 

IView1 view1;
IView2 view2;
public Presenter() { view1 = new View1(this); view2 = new View2(this); }

あなたの場合、複数のビューを調整するプレゼンターは次のようになります(疑似):

public class Presenter : IPresenter
{
  IView1 view1;
  IView2 view2;
  public Presenter() 
  {
    view1 = new View1(this);
    view2 = new View2(this);
  }

  private WireViewEvents()
  {
    view1.OnButtonClick += HandleButtonClickFromView1;
  }

  public void HandleButtonClickFromView1()
  {
    view2.SetSomeData();
    view2.Show();
}

この例では、によって発生したイベントがView1プレゼンターによって処理され、データがに設定されてView2表示View2されます。

実装が何であっても、MVPの目標は次のとおりであることに注意してください。

  • 関心の分離(UIはドメインロジックから分離されています)。
  • 妥当性の向上。

これは、プレゼンターが複数のビューを調整する方法の基本的な例にすぎないことに注意してください。ビューの作成をプレゼンターから抽象化する場合は、作成を別のコンテナーに移動して、プレゼンターがビューを作成し、そのイベントをサブスクライブするために呼び出すことができます。

于 2013-02-13T19:09:33.367 に答える
3

MVPでは、winformsは相互に通信するべきではありません。フォームAはプレゼンターAを知っており、フォームBはプレゼンターBを知っています

通常、フォームAからPrensenter Aを使用してモデルを変更します。プレゼンターBはモデルの変更をリッスンし、それに応じてフォームBを更新します。

さらに調整が必要な場合は、アプリケーションコントローラーの使用を検討してください。

http://dotnetslackers.com/articles/designpatterns/The-Presenter-in-MVP-Implementations.aspxを参照してください

于 2013-02-15T23:11:01.963 に答える
1

2つのビューがインターフェイスを使用してPresenterを介して相互に通信しようとしているダミーコードを示しています。これは簡単な例であり、何かが壊れているかどうかをmwに知らせます。私は正直に言うと、このコードをテストしていません。

namespace WindowsFormsApplication1
{
    internal class View1 : IView1
    {
        public View1()
        {
            new Presenter(this);
        }


        public string Username { get; set; }
        public event EventHandler ShowDetails;
    }
}

namespace WindowsFormsApplication1
{
    internal class View2 : IView2
    {
        public View2()
        {
            new Presenter(this);
        }

        public string Position { get; set; }
    }
}

namespace WindowsFormsApplication1
{
    public class Presenter
    {
        private readonly IView1 _view1;
        private readonly IView2 _view2;

        public Presenter(IView1 view1)
        {
            _view1 = view1;
            _view1.ShowDetails += ShowDetails;
        }

        private void ShowDetails(object sender, EventArgs e)
        {
            _view2.Position = _view1.Username == "My Name" ? "Arhchitect" : "Project Manager";
        }

        public Presenter(IView2 view2)
        {
            _view2 = view2;
        }

    }

}

public interface IView1
{
    string Username { get; set; }

    event EventHandler ShowDetails;
}

public interface IView2
{
    string Position { get; set; }
}

しかし、この例の後にいくつかのメモがあります。アプリケーションを開始するには、1つまたは2つのインターフェイスを使用する最初の天気を決定してみてくださいView。単一のインターフェイスを使用できる場合は、チャンスがあり、さらには簡単になる可能性があります。

于 2013-02-14T13:32:21.413 に答える
0

プレゼンターに変更を認識させるためにイベントを発生させるモデルについて先に述べた点は正しいと思います。役に立つと思うコメントがいくつかあります。

まず、ビューの実装は単一のフォームではない可能性があります。場合によっては、ビュー内の複雑なコントロールのように実際に機能する別の (おそらくモーダル) フォームによってモデルの一部を維持することが理にかなっていることがあります。その場合、フォーム間の相互作用は直接的になります。プレゼンターは、View の実装方法を気にする必要はありません。

次に、明らかに同じビューの一部ではないフォーム (ルックアップ フォームなど) が対話する必要があるように見える場合は、アプリケーション コントローラー パターンを使用することをお勧めします。この場合、フォーム A が機能 (「製品の検索」や「詳細の編集」など) を実行する必要がある場合、それを実行するために独自のプレゼンターでメソッドを呼び出します。次に、プレゼンターはアプリケーション コントローラー (すべてのプレゼンターが参照する、シングルトン) で別のメソッドを呼び出し、アプリケーション コントローラーは独自のプレゼンターを持つ必要なフォームを開きます。WinForms では、これはすべてモーダル フォームで実行できます。この場合、結果は呼び出しチェーンを介して送り返されます。または、アプリケーション コントローラーとプレゼンターの間で何らかのイベントを発生させる必要があります。つまり、

MVP のアプリケーション コントローラー パターンの詳細については、私のブログ記事Using the MVP Pattern を参照してください。

于 2013-02-28T16:06:14.403 に答える