2011-12-02 25 views
5

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

理想的には、ToolbarRegion(私のシェルの2つの領域の1つ)にToolbarViewのボタンがあります。このボタンは、私のToolbarViewModel(ToolbarControlerのコマンドを参照しています)でコマンドを呼び出すと、2つのことを行います(私は思うのですか?)...まず、すべての加入者に閉じる時間を通知し、 ... 2番目に、キャンセルがなければ、何とかシェルに終了を知らせる。私のアプリのシャットダウンモードは "ShutdownMode.OnMainWindowClose"に設定されているので、シェルが終了したら、私はすべて設定する必要があります。

誰かがこれで私を助けることができますか?私は同じものを使用して大規模なアプリケーションを研究開発をしてい

答えて

3

:MEFとPrismV4

は、私がシャットダウン少し違っそれを処理:シェルで
、「ツール」地域があり、そのためのシャットダウンが処理されます終了イベントでシェルの右
次に、タブコントロールである他の領域に注入されたものについては、IDisposableとしてコンテンツをキャストし、すべてのタブを1つずつ閉じます。 (実際はタブコントロールではなく、avalondockコンポーネントですが、実際は同じことです)。
言うまでもなく、ディスパッチする参照を持つすべてのクラスにIDisposableを実装する必要がありますが、インタフェースの権利を意識することなく「シャットダウンのきれいな方法」を考えるのは難しいですか? =)

EventAggregatorについて:カップリングがないので、問題が発生する可能性があります。弱いイベントを発生させることはできますが、それ以降はオブジェクトが処理を待つことはできません。
その後、シャットダウンをキャンセルする仕組みを作ることができませんでした。

あなたは様々な意見がシャットダウンをキャンセルすることができるようにしたい場合は、私はあなたがそれで一つの方法とのインタフェースを作成するお勧め:

public interface IShutdownAware 
{ 
    bool CanShutdown(); 
} 

次にあなたが処分を呼び出す直前に、彼ら場合CanShutdown();を呼び出しますすべて真となり、処理を続行します。それ以外の場合は、シャットダウン処理をキャンセルします。

+0

私はこの方法が好きですが、私はまだ質問があります。アクティブなビュー(またはビューモデル)をどのように把握していますか? CanShutdown()を呼び出すためにどのコレクションを繰り返しますか? IRegionManagerを使用してアクティブビューを照会していますか? – Thelonias

+1

シェルでこれを実行するので、シェルで持っているさまざまなレイアウト要素の内容を照会し、それらを繰り返し処理できます。おそらくIRegionManagerでも可能ですが、あなたのシナリオで最も効果的なものを試してみてください。 –

関連する問題