8

私は、画像取得、画像処理、データ ストレージ、工場 I/O (自動化プロジェクト) など、いくつかの大きなコンポーネントを含む大規模なプロジェクトの完了段階にあります。

これらの各コンポーネントは適度に独立していますが、プロジェクト全体を実行するには、各コンポーネントのインスタンスが少なくとも 1 つ必要です。各コンポーネントには、ステータスを監視して物事を変更するための ViewModel と View (WPF) もあります。

私の質問は、これらすべてのオブジェクトをインスタンス化し、あるクラスを別のクラスの Event にサブスクライブし、これらすべてに共通の ViewModel と View を持つ最も安全で、最も効率的で、最も保守しやすい方法です。

これらすべてのオブジェクトのプライベート インスタンスを持つ God という名前のクラスがあれば最適でしょうか? 過去にやって後悔したことがあります。

それとも、神がこれらのオブジェクトの Singleton インスタンスに依存してボールを転がすことができた方がよいでしょうか。

または、Program.cs (または Main(...) がある場所) でこれらすべてのコンポーネントをインスタンス化し、それらをパラメーターとして神に渡し、神 (笑) と神の ViewModel にこのプロジェクトの実行の詳細を処理させる必要があります。

私が聞きたい他の提案。

ありがとうございました!

4

5 に答える 5

3

これらの問題は、複合 WPF アプリケーションを開発するためのフレームワークである Microsoft の「複合アプリケーション ライブラリ」(別名 Prism) を使用して、非常にうまく処理されます。

http://msdn.microsoft.com/en-us/library/ff647752.aspx

http://msdn.microsoft.com/en-us/library/ff648611.aspx

  • ビューの構成: Prism には、アプリケーション シェル ウィンドウとリージョン マネージャーの概念があります。シェルは、"MainMenu" や "TabInterface" などの名前付きプレースホルダー領域を定義する必要最小限のレイアウト ページとして機能します。「MainMenuModule」や「TabInterfaceModule」などのモジュール クラスでビューとビューモデルへの参照をラップし、モジュールを関連付ける領域を定義します。Prism はビューを作成し、アプリケーションの起動時にシェル領域に挿入します。これにより、ビューを互いに独立して構成することができます。

  • ビューモデル間の通信: Prism は、「イベント アグリゲーター」と呼ばれるメディエーター パターンをサポートします。基本的に、ビューモデルからイベント アグリゲーターを介してメッセージを発行およびサブスクライブできます。これにより、ビューモデルは、お互いを認識してイベントをフックするのではなく、メッセージを介して大まかに通信できます。

Prism は、神のオブジェクトを導入したり過剰に結合したりすることなく、疎結合の方法で互いに独立してコンポーネントを開発するためのパターンを提唱し、サポートします。Prism の大部分は、IOC と依存性注入の使用でもあるため、単体テストもはるかに簡単になります。

次の記事は、Prism と MVVM を使用するための優れた実用的な紹介であることがわかりました。

http://www.developmentalmadness.com/archive/2009/10/03/mvvm-with-prism-101-ndash-part-1-the-bootstrapper.aspx

于 2010-06-01T17:22:57.977 に答える
3

Unity (CAL が使用)、Castle Windsor、Spring.NET などのいくつかの依存性注入フレームワークを見てみましょう。

于 2010-06-01T17:27:15.503 に答える
2

ViewModel を取得するための私の好みの方法は、ViewModelLocater を使用することです。基本的にはあなたが暗示するように神のオブジェクトですが、各ViewModelを作成してそれへの参照を保持することだけが責任です。私は通常、VML をアプリのリソースに追加し、各ビューはその DataContext を正しい ViewModel に設定する責任があります。複数のイベントをサブスクライブしている場合は、VML を手動で接続するか、イベントを最初にスローする VM を作成し、そのコンストラクターで依存する VM に渡すことができます。

于 2010-06-01T16:05:04.433 に答える
1

「神」クラスの代わりにコントローラー(ApplicationController、ユースケース コントローラー) を使用することもできます。コントローラーは ViewModel オブジェクトを作成し、それらの間を仲介します。

これがどのように機能するかは、WPF アプリケーション フレームワーク (WAF)プロジェクトによって示されます。

于 2010-06-03T22:08:48.853 に答える
0

あなたの質問がよく理解できたと思います。God ViewModel を使用するのは良い考えではないと思います。ビューごとに単一のビューモデルを用意し、そのビューモデルで関連するすべてのビューモデルをインスタンス化することをお勧めします。次に、メディエーターを使用して、そのビューのビューモデルと他のビューの間で安全にメッセージを送信できます。また、イベントの代わりに wpf コマンドを使用することを提案します。ここでメディエーターに関する素晴らしい記事を見つけることができます。

于 2010-06-01T16:50:39.567 に答える