web-dev-qa-db-ja.com

MVCをWindowsフォームアプリケーションにどのように実装しますか?

デスクトップ/ Windows Formsアプリケーションをあまり多く開発していませんが、Windows Forms .NET開発にMVC(Model View Controller)パターンを使用することには何らかの利点があるかもしれないと思いました。

誰かがWindowsフォームにMVCを実装していますか?もしそうなら、デザインに関するヒントはありますか?

64

私が過去にやったことは、同様の何か Model-View-Presenter を使用することです。

[注:この記事は、以前はWebで利用可能でした。今すぐ表示するには、CHMをダウンロードし、ファイルのプロパティを表示して[ブロックを解除]をクリックする必要があります。その後、CHMを開いて記事を見つけることができます。マイクロソフトに感謝します! ため息]

フォームはビューであり、そのためのIViewインターフェイスがあります。すべての処理は、単なるクラスであるプレゼンターで行われます。フォームは新しいプレゼンターを作成し、プレゼンターのIViewとして自分自身を渡します。このテスト方法では、代わりに偽のIViewを渡し、プレゼンターからコマンドを送信して結果を検出できます。

本格的なModel-View-Controllerを使用する場合は、次のようにします。

  • フォームはviewです。モデルにコマンドを送信し、コントローラーがサブスクライブできるイベントを発生させ、モデルからのイベントをサブスクライブします。
  • controllerは、ビューのイベントにサブスクライブし、ビューとモデルにコマンドを送信するクラスです。
  • modelは、ビューがサブスクライブするイベントを発生させます。

これは、 従来のMVCダイアグラム に適合します。最大の欠点は、イベントの場合、誰が何に登録しているのかわかりにくいことです。 MVPパターンは、イベントの代わりにメソッドを使用します(少なくとも私が実装した方法)。フォーム/ビューがイベント(someButton.Clickなど)を発生させると、フォームはプレゼンターのメソッドを呼び出して、そのロジックを実行するだけです。ビューとモデルには直接的な接続はまったくありません。どちらもプレゼンターを通過する必要があります。

40
Ryan Lundy

実際、Windows FormsはMVCの「フリースタイル」バージョンを実装しています。これは、一部の映画がいくつかの古典的な本のくだらない「フリースタイル」解釈を実装しているように(Romeo&Julietが思い浮かびます)。

Windows Formsの実装が悪いと言っているのではなく、ただ...異なっています。

Windowsフォームと適切なOOPテクニック、およびおそらくデータベースアクセスにEntitySpacesのようなORMを使用する場合、次のように言えます。

  1. ORM/OOPインフラストラクチャはモデルです
  2. フォームはビューです
  3. イベントハンドラーはコントローラーです

ビューとコントローラーの両方を同じオブジェクトで表すと、コードを表現方法から分離するのが難しくなります(Microsoft.Windows.Forms.Formから派生したクラスに「GTK +ビュー」をプラグインする簡単な方法はありません)。

十分に注意していれば何ができるか。フォームコードを保持する完全イベントハンドラーでGUI関連のもの、および他のすべてのビジネスロジックを別のクラスで記述するだけで、コントローラー/モデルコードから分離します。その場合、GTK +を使用して別のビューレイヤーを記述したい場合、GUIコードを書き直すだけで済みます。

19
dguaraglia

Windows Formsは、MVCを使用するためにゼロから設計されたものではありません。 2つのオプションがあります。

最初に、MVCの独自の実装をロールバックできます。

次に、Windowsフォーム用に設計されたMVCフレームワークを使用できます。

最初の方法は簡単に開始できますが、先に進むほど複雑になります。 Windows Formsと連携するように設計された、既存の十分にテストされた優れたMVCフレームワークを探すことをお勧めします。 このブログ投稿 はまずまずの出発点だと思います。

オプションをお持ちの場合は、Windows Formsをスキップし、WPFに対して開発することをお勧めします。 UIを作成するためのはるかに優れたフレームワークです。 this onethat one など、WPF用に開発されている多くのMVCフレームワークがあります。

17
Will

Microsoftによると、@ jasonbuntingが言及しているUIPアプリケーションブロックは「アーカイブ」されています。代わりに、WinFormsとWPF SmartPartsの両方をサポートする Smart Client Application Block またはさらに新しい Smart Client Software Factory を見てください。

4
aridlehoover

ユーザーインターフェイスプロセス(UIP)アプリケーションブロック を確認します。私はそれについてあまり知りませんが、数年前にそれを見ました。新しいバージョンがあるかもしれませんので、確認してください。

「UIPアプリケーションブロックは、モデルビューコントローラー(MVC)パターンに基づいています。」

2
Jason Bunting

MS Forms and Practices Smart Clientアプリケーションブロックをご覧ください。Windowsフォームにモデルビュープレゼンターパターンを実装するためのいくつかのガイダンスとクラスがあります-含まれているリファレンスアプリケーションをご覧ください。

WPFの場合、これは prism プロジェクトによって上書きされています

ソフトウェアファクトリアプローチは、ベストプラクティスを学ぶのに最適な方法です

1
Richard