Windows フォーム アプリケーションに MVC を実装するにはどうすればよいでしょうか?
-
02-07-2019 - |
質問
私はデスクトップ/Windows フォーム アプリケーションをあまり開発しませんが、Windows フォーム .NET 開発に MVC (モデル ビュー コントローラー) パターンを使用することには何らかの利点があるかもしれないと思いつきました。
Windows フォームに MVC を実装した人はいますか?もしそうなら、デザインに関するヒントはありますか?
解決
私が過去にやったことは、同様のものを使用することでした、 モデル-ビュー-プレゼンター.
[注記:この記事は以前は Web 上で公開されていました。今すぐ確認するには、CHM をダウンロードし、ファイルのプロパティを表示して、[ブロック解除] をクリックする必要があります。その後、CHM を開いて記事を見つけることができます。マイクロソフトさん、100万ありがとう! はぁ]
フォームはビューであり、そのための IView インターフェイスがあります。すべての処理は、単なるクラスであるプレゼンター内で行われます。フォームは新しいプレゼンターを作成し、それ自体をプレゼンターの IView として渡します。この方法でテストすると、代わりに偽の IView を渡し、プレゼンターからそれにコマンドを送信して結果を検出できます。
本格的な Model-View-Controller を使用する場合は、次のようにすると思います。
- フォームは、 ビュー. 。コマンドをモデルに送信し、コントローラーがサブスクライブできるイベントを生成し、モデルからのイベントをサブスクライブします。
- の コントローラ は、ビューのイベントをサブスクライブし、ビューとモデルにコマンドを送信するクラスです。
- の モデル ビューがサブスクライブするイベントを発生させます。
これは 古典的な MVC ダイアグラム. 。最大の欠点は、イベントの場合、誰が何をサブスクライブしているかを判断するのが難しいことです。MVP パターンでは、イベントの代わりにメソッドが使用されます (少なくとも私が実装した方法では)。フォーム/ビューがイベントを発生させたとき (例:someButton.Click) の場合、フォームはプレゼンターのメソッドを呼び出してロジックを実行するだけです。ビューとモデルには直接的な関係がまったくありません。どちらもプレゼンターを経由する必要があります。
他のヒント
そうですね、実際には、Windows フォームは MVC の "フリー スタイル" バージョンを実装しています。これは、いくつかの映画が古典的な本 (ロミオとジュリエットが思い浮かびます) のくだらない "フリー スタイル" 解釈を実装しているのとよく似ています。
Windows フォームの実装が悪いと言っているのではなく、ただ...違う。
Windows フォームと適切な OOP テクニック、そしておそらくデータベース アクセスに EntitySpaces のような ORM を使用している場合は、次のように言えます。
- ORM/OOP インフラストラクチャがモデルです
- フォームはビューです
- イベントハンドラーはコントローラーです
ただし、ビューとコントローラーの両方を同じオブジェクトで表すと、コードと表現を分離することがさらに難しくなります (Microsoft.Windows.Forms.Form から派生したクラスに「GTK+ ビュー」をプラグインする簡単な方法はありません)。
十分に注意していればできること。フォームコードを保持していますか 完全に イベント ハンドラーに GUI 関連のものだけを記述し、他のすべてのビジネス ロジックを別のクラスに記述することで、コントローラー/モデル コードから分離します。その場合、GTK+ を使用して別の View レイヤーを作成したい場合は、GUI コードを書き直すだけで済みます。
Windows フォームは、MVC を使用するように最初から設計されていません。選択肢は 2 つあります。
まず、独自の MVC 実装を実行できます。
2 番目に、Windows フォーム用に設計された MVC フレームワークを使用できます。
最初の作業は簡単に始めることができますが、奥に進むほど複雑になっていきます。Windows フォームで動作するように設計された、十分にテストされた既存の優れた MVC フレームワークを探すことをお勧めします。私は信じている このブログ投稿 は適切な出発点です。
これから始める人には、可能であれば、Windows フォームをスキップして、WPF を使用して開発することをお勧めします。これは、UI を作成するためのはるかに優れたフレームワークです。WPF 用に開発されている MVC フレームワークは数多くあります。 これです そして それです.
Microsoftによると、@JasonBuntingが言及したUIPアプリケーションブロックは「アーカイブ」です。代わりに、を見てください スマートクライアントアプリケーションブロック あるいはさらに新しいもの スマート クライアント ソフトウェア ファクトリ, 、WinForms と WPF SmartParts の両方をサポートします。
にチェックインしてください ユーザー インターフェイス プロセス (UIP) アプリケーション ブロック. 。あまり詳しくないのですが、数年前に見たことがあります。新しいバージョンがある可能性がありますので、確認してください。
「UIP アプリケーション ブロックは、モデル ビュー コントローラー (MVC) パターンに基づいています。」
MS Patterns and Practices Smart Client アプリケーション ブロックを見てください。このブロックには、Windows フォームでモデル ビュー プレゼンター パターンを実装する手順を説明するいくつかのガイダンスとクラスが含まれています。含まれているリファレンス アプリケーションを見てください。
WPF の場合、これは次のによって置き換えられます。 プリズム プロジェクト
ソフトウェア ファクトリのアプローチは、ベスト プラクティスを学ぶための優れた方法です