MVP / プレゼンテーション モデル UI パターンを正しく実装していますか?
-
26-09-2019 - |
質問
Winforms アプリケーションを再作成しており、そのバリエーションを採用したいと考えています。 プレゼンテーションモデルのパターン UIの場合。私が正しくやっているかどうか、誰かが次の説明から教えてもらえますか?
次のように依存関係を設定することにしました。
Model <---- Presentation Model <---- View
あれは:
モデルはそれ自体以外は何も認識しません。
プレゼンテーション モデルにはモデルへの参照があります (ただし、その逆はありません)。
ビューにはプレゼンテーション モデルへの参照があります (ただし、その逆はありません)。
Winforms データ バインディングを使用して、ビューとプレゼンテーション モデルの同期を維持しています。
これで、たとえば問題に対処する必要がある場合を除いて、すべてが魅力的に機能します。フォームの「閉じる」ボタンをクリックします。プレゼンテーション モデルにはビューへの参照がないため、ビューによって発行されたイベントをサブスクライブできません。そこで、私は次のような松葉杖を思いつきました。
Presentation Model View
+--+ +--+
| | | |
| | | <--------X closeButton.Click event fires
| | | |
| | +--------X |
| | CloseRequested = true | | |
| | +--------> |
| | | |
| | CloseRequested CloseRequested | |
| <-----------------------------------< |
| | | |
| X--------+ | |
| | | IsClosed = true | |
| <--------+ | |
| | | |
| | IsClosed MustClose | |
| >-----------------------------------> |
| | | |
| | | X--------> view.Close()
| | | |
+--+ +--+
あれは:
ユーザーは「閉じる」ボタンをクリックします。
ボタンの
Click
イベントはビューにキャプチャされ、プロパティを設定することで反応します。CloseRequested
.データ バインディングは、この値をプレゼンテーション モデル内の対応するプロパティに転送します。
プレゼンテーション モデルは、プロパティを設定することでこの変更に反応します。
IsClosed
.データ バインディングは、この値をビューのビューに転送します。
MustClose
.ビューは、この変更に反応してビュー自体を閉じます。
プレゼンテーション モデルはビューから非常にうまく分離されており、その逆も同様です。 ボタン 1 つコマンドを処理するだけでも大変な作業です. 。私が決定した依存関係グラフを考慮して、より簡単な方法はありますか?
解決
私は最近、MVPアーキテクチャにWindowsフォームアプリケーションを変換してきた、とあなたは私が行ってきたものと同様の方法であなたの依存関係を設定しているように見えます。しかし、私は、単にビューがユーザの要求に通過できるようにするメソッドを定義IPresenter
インターフェースを有しています。ビューがすでにプレゼンターとそれへの参照に依存しているとして、単に直接のリクエストメソッドを呼び出すことが賢明なようです。
だから、イベントにプレゼンターリッスンモデルからとのために聞くために利害関係のビューのために、独自のプレゼンテーションイベントを発生させます。必要に応じて自分自身を更新することによって、これらのイベントに応答し、ビュー、および転送し、彼らが行われた発表者へのユーザー要求ます。
他のヒント
これは私の意見です。
プレゼンテーションモデルでの作業はデータバインディングの100%のUIのサポートを必要とします。でも、WPFは、バインド可能な限り近い行動をすることはありません。事の多くは、このようなメッセージボックス確認としてプレゼンテーションモデルにスムーズに動作しないでしょう。でもそれは、プレゼンターのインターフェースで抽象化することができますが、それでも良いとシンプルさを犠牲にされた味がしない。
は一方では、プレゼンテーションモデルの主な目的は、テストザビューロジックです。それはあなたのコードが唯一の選択肢である近く続いている前にいくつかのロジックがあるのため、いくつかのケースでは、あなたの「閉じるアクション」であるべき単位がテストされている場合。しかし、それは簡単な確認、あなたがより良い表示にすることを置く「あなたが終了してもよろしいです」だけでない場合、それはユニットテストに必要とされていないため、プレゼンテーションモデルでます。
ビューへの参照を持っています プレゼンテーションモデル(ただしバイス その逆)。
私の知る限りプレゼンテーションは、具体的な視野を持つプレゼンテーションdosen'tカップルようにたIViewのインタフェースに、より正確に表示するrefferenceを持っている必要があります。そして、プレゼンテーションクラスでは、ビューのメソッドを呼び出すとIViewのを経由してイベントを表示するために加入することができる。