5

MEFとPRISM4を使用するWPFアプリケーションをクリーンにシャットダウンするための「ベストプラクティス」(ベストプラクティスがある場合)を探しています。最終的には、シェルからアプリケーションを閉じても問題がないことを確認したいビューモデル(または他のサブスクライバー)までのすべてのイベント/コマンドを管理する、ある種の「サービスを閉じる」を探しています。イベントアグリゲーターは最もクリーンな方法ですか?他の意見/オプション?

理想的には、ToolbarRegion(シェルの2つの領域のうちの1つ)のToolbarViewにボタンがあります。このボタンは、ToolbarViewModelのコマンド(ToolbarControlerのコマンドを参照)を呼び出し、次に2つのことを実行します(私は思いますか?)...最初に、すべてのサブスクライバーにクローズ時間であることを通知し、いずれかのサブスクライバーがクローズをキャンセルできるようにしますそして...次に、キャンセルされない場合は、どういうわけかシェルに閉じるように通知します。私のアプリのシャットダウンモードは「ShutdownMode.OnMainWindowClose」に設定されているので、シェルが閉じたら、すべて設定されているはずです。

誰かがこれを手伝ってくれますか?

4

1 に答える 1

3

私は同じものを使用して大規模なアプリケーションを開発しています:MEFとPrismV4

シャットダウンの処理は少し異なります。
シェルには「ツール」リージョンがあり、そのためのシャットダウンはシェルのクローズイベントで直接処理されます。
次に、タブコントロールである他の領域に注入されたすべてのものについて、コンテンツをIDisposableとしてキャストし、すべてのタブを1つずつ閉じます。(実際には、これはタブコントロールではなく、アバロンドックコンポーネントですが、実際には同じものです)。
もちろん、破棄するための参照などがあるすべてのクラスにIDisposableを実装する必要がありますが、そのインターフェイスを意味せずに「シャットダウンするクリーンな方法」を考えるのは難しいですか?=)

さて、EventAggregatorについて:カップリングがないため、問題が発生する可能性があります。弱いイベントを発生させることはできますが、その後、オブジェクトが作業を行うのを待つことはできません。
そして、シャットダウンをキャンセルするメカニズムを作成できませんでした。

さまざまなビューでシャットダウンをキャンセルできるようにする場合は、単一のメソッドを含むインターフェイスを作成することをお勧めします。

public interface IShutdownAware
{
   bool CanShutdown();
}

次に、disposeを呼び出す直前にCanShutdown();、それらがすべてtrueを返す場合は呼び出し、破棄を続行します。それ以外の場合は、シャットダウンプロセスをキャンセルします。

于 2011-12-30T18:44:29.920 に答える