Prism と MEF/Unity を使用してかなり大規模なアプリケーションを開発するとき、私は常に、イベント、サービス、またはその両方を使用するかどうかを選択する必要があります。そして、何が最も使いやすいかを決めることはできません。私のアーキテクチャに何か問題があるのかもしれません (この決定は最初から行う必要がないため) が、何がわかりません。
典型的な例を次に示します。私のアプリケーションには、メイン ウィンドウと、モジュールまたはユーザー アクションによってオンデマンドで作成される多数のスレーブ ウィンドウがあります。アプリケーションは、コンテンツ自体がモジュールのどこかに作成されている間に、スレーブ ウィンドウのクロムの外観と動作を決定し、ウィンドウの配置などを記憶します。ウィンドウの非表示/表示/前面への移動につながるユーザー アクションも多数あります。これらすべてを実現するために、私は現在、CreateWindow/SetWindowState/.. イベントをリッスンする WindowManager サービスを用意しています。
これには次の利点があります。
- これを使用するクラスは、IEventAggregator (他のイベントのためにほとんどの場合既に使用している) と、WindowManager 自体ではなく、WindowManager によって消費されるイベントについてのみ認識します。
- ViewModel のようなクラスは、ウィンドウを直接扱いません。代わりに、タイトルまたは ID と、必要なものだけをカプセル化する小さなイベント クラスによってそれらを参照します。
- テストでモックするためだけに、別の IWindowManager インターフェイスは必要ありません
そして引き出し:
- WindowManager は完全にスタンドアロンで使用できますが、イベントをサブスクライブする必要があります。または、おそらくより良いのは、他のクラスがそれを処理する必要があることです。
- モーダル ダイアログを表示するように拡張するのはややこしいことです。VM がダイアログを表示するイベントを発生させる場合、ダイアログが閉じられた後にのみ Publish 呼び出しが返されることが非常に重要です。
- WindowManager はサービスとして利用でき、CompositionContainer にあります。とにかくそれを使用しないのはなぜですか?
サービスを直接使用すると、特典/引き出しがシフトするだけで、明確な勝者はないようです.
質問: どちらか一方を選択するためのガイダンス ルールとして何を使用しますか? それとも常にどちらか一方または両方を選択しますか? この決定を下さなければならない、アプリケーションの設計に特に問題があるのでしょうか?