2011-12-02 19 views
5

Sto cercando una "best practice" (se ce n'è anche una migliore) per chiudere in modo pulito un'applicazione WPF che utilizza MEF e PRISM4. In definitiva, sto cercando una sorta di "Close Service" che gestirà tutto l'evento/comando da Shell a qualsiasi viewmodel (o altri abbonati) che vogliono verificare che sia OK chiudere l'applicazione. L'aggregatore di eventi è il modo più pulito? Altre opinioni/opzioni?Arresto anomalo dell'applicazione tramite WPF PRISM 4

Idealmente, avrei un pulsante nel mio ToolbarView nel mio ToolbarRegion (1 di 2 regioni nella mia shell). Questo pulsante richiamerebbe un comando sul mio ToolbarViewModel (facendo riferimento a un comando sul mio ToolbarControler) che a sua volta farebbe 2 cose (credo?) ... In primo luogo, notifica a tutti gli abbonati che è il momento di chiusura e consente a tutti di annullare la chiusura e ... in secondo luogo, se nessuno annulla, in qualche modo notifica alla shell di chiudere. La modalità di spegnimento della mia app è impostata su "ShutdownMode.OnMainWindowClose", quindi se la Shell si chiude, dovrei essere tutto pronto.

Qualcuno può aiutarmi con questo?

risposta

3

Sto sviluppando un'applicazione di grandi dimensioni utilizzando la stessa roba: MEF e PrismV4

gestisco arresto è un po 'diverso:
in the Shell, v'è una Regione "Strumenti", l'arresto per questo viene gestito proprio nella Shell, nell'evento vicino.
Quindi, per tutto ciò che viene iniettato nell'altra regione, che è un controllo a schede, lancio il contenuto come IDisposable e chiudo tutte le schede una per una. (In realtà, non è un tabcontrol, è un componente avalondock, ma è la stessa cosa in realtà).
Ovviamente, è necessario implementare IDisposable su ogni classe che ha riferimenti ecc. Da disporre, ma è difficile pensare a un "modo pulito di arrestare" senza creare un'interfaccia corretta? =)

Ora, a proposito di EventAggregator: potresti trovarti molto nei guai, perché non c'è nessun accoppiamento: puoi lanciare un evento debole attraverso di esso, ma dopo non puoi aspettare che gli oggetti facciano il loro lavoro.
E quindi, non è possibile creare un meccanismo per annullare l'arresto.

Nel caso in cui si desidera che il vari punti di vista per essere in grado di annullare l'arresto, io suggerisco di creare un'interfaccia con un unico metodo in essa:

public interface IShutdownAware 
{ 
    bool CanShutdown(); 
} 

Poi a destra prima di chiamare smaltire, chiamare CanShutdown(); se tutto restituisce true, procedi con lo smaltimento, altrimenti, annulla il processo di spegnimento.

+0

Mi piace questo metodo, ma ho ancora una domanda. Come tieni traccia delle tue visualizzazioni attive (o vedi i modelli)? Quale raccolta si itera per chiamare "CanShutdown()"? Usi IRegionManager e chiedi le viste attive? – Thelonias

+1

Dato che lo fareste in Shell, potreste semplicemente interrogare il contenuto dei vari elementi di layout che avete nella Shell e scorrere su di essi. Probabilmente è possibile anche con IRegionManager, prova a vedere cosa funziona meglio nel tuo scenario. –

Problemi correlati