2

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つのボタンコマンドを処理するためだけの多くの作業です。私が決定した依存関係グラフを考えると、もっと簡単な方法はありますか?

4

3 に答える 3

2

私は最近、Windows フォーム アプリケーションを MVP アーキテクチャに変換していますが、私が行っているのと同様の方法で依存関係を設定しているようです。ただし、IPresenterビューがユーザー要求を渡すことができるようにするメソッドを定義するインターフェイスを持っているだけです。ビューはすでにプレゼンターへの依存関係とそれへの参照を持っているため、単純にリクエスト メソッドを直接呼び出すのが賢明と思われます。

したがって、私のシステムでは、プレゼンターはモデルからのイベントをリッスンし、関心のあるビューがリッスンするために独自のプレゼンテーション イベントを発生させます。ビューは、必要に応じて自分自身を更新することでこれらのイベントに応答し、ユーザーの要求が行われたときにプレゼンターに転送します。

于 2010-08-09T07:00:15.160 に答える
1

それは私の意見です。

プレゼンテーション モデルを操作するには、データ バインディングの 100% UI サポートが必要です。WPF でさえ CLOSE アクションを Bindable にしません。MessageBox Confirmation などのプレゼンテーション モデルでは、多くのことがスムーズに機能しません。Presenter インターフェイスで抽象化することもできますが、それでも味が悪く、シンプルさが犠牲になります。

一方、プレゼンテーション モデルの主な目的は、ビュー ロジックをテストすることです。場合によっては、閉じる前にいくつかのロジックがあるために「閉じるアクション」を単体テストする必要がある場合は、コードが唯一の選択肢です。ただし、「終了してもよろしいですか」という単純な確認のみの場合は、単体テストが不要なため、プレゼンテーションモデルではなくビューに配置することをお勧めします。

于 2010-08-10T06:45:54.847 に答える
0

ビューにはプレゼンテーション モデルへの参照があります (逆はありません)。

私の知る限り、プレゼンテーションは具体的なビューと結合しないように、IView をインターフェイスするために、より正確に表示するための参照を持っている必要があります。次に、プレゼンテーション クラスでビュー メソッドを呼び出し、IView を介してビュー イベントをサブスクライブできます。

于 2010-08-09T07:52:08.383 に答える