2012-03-06 12 views
5

sto usando Castello di Windsor come il mio contenitore in un'applicazione Caliburn-Micro Silverlight. I miei oggetti ViewModel sono ragionevolmente grandi perché chiamano servizi WCF e un sacco di altre cose. Pertanto, quando una finestra è chiusa, voglio chiamare container.Release (viewModel) in modo che Castle possa gestire l'intero processo di smantellamento/smaltimento, rispettando i vari cicli di vita configurati (come indicato in this post).Smaltimento di ViewModels in Caliburn Micro e il Castello di Windsor

Nel mio AppBootstrapper ho ignorato GetInstance come segue:

protected override object GetInstance(Type serviceType, string key) 
{ 
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType); 
    return container.Resolve(key, serviceType); 
} 

ma sto lottando per trovare un modo pulito/elegante di chiamare container.Release(viewModel). Non sembrano essere disponibili ganci per questo.

Qual è il modo più semplice di rilasciare oggetti ViewModel tornato da ViewModelLocator in un'applicazione Caliburn Micro?

risposta

0

Il ciclo di vita che si desidera per ciascuno dei vostri tipi VM sta per avere un impatto qui, quindi non c'è davvero una risposta giusta per il contesto che ci ha fornito.

La classe di base Screen di CM fornisce protected virtual void OnDeactivate(bool close); che è un buon punto di partenza. Per il vostro peso massimo VM è necessario eseguire l'override di questo metodo, e se la VM sta chiudendo indicato dal parametro stretta, rilasciare tutte le risorse (canali WCF, ecc) che devono essere smaltiti, questo includerebbe smaltire la risorsa (se IDisposable è rilevante) e anche scollegando qualsiasi riferimento ad esso in modo che possa essere ripulito dal GC.

Non uso Castle, quindi non posso aiutarti in termini di configurazione dei cicli di vita, ecc. Ma se segui quanto sopra, non ti manterrai per nulla di pesante. Presumo che con la corretta configurazione del ciclo di vita, Castle pulirà tutte le vecchie istanze che non si intende utilizzare nuovamente senza una chiamata esplicita a Release.

+0

Grazie mille @Simon. Avevo esplorato la rotta OnDeactivate come luogo da agganciare. Sì, se disponi di una VM con un elenco di parametri del costruttore lungo, Castle soddisferà tutte le dipendenze del costruttore del componente. Quindi, quando il componente è Release() d Castle rilascia tutte le dipendenze, in base agli stili di vita configurati per ciascuno di essi. La cosa importante qui è che gli stessi Vms non sono responsabili per nessuno dei lavori di pulizia - è tutto automatico. –

+0

Spingere la responsabilità verso le VM stesse potrebbe funzionare, ma significa che le VM iniziano ad essere inquinate dalle responsabilità del ciclo di vita che voglio davvero tenere fuori da esse, se possibile. Idealmente la responsabilità di uscita dovrebbe vivere con la responsabilità di Resolve - vale a dire più in alto lo stack di chiamate, nel programma di avvio automatico o al contenitore stesso ... –

+0

Sì questo è sorta di quello che sto dicendo, ad esempio se si è configurato il tipo di VM con un ciclo di vita di "uso singolo" (qualunque sia la mappatura di in Castle), quindi la prossima volta che richiedi un'istanza di quel tipo, il contenitore dovrebbe semplicemente rilasciare l'istanza usata perché è già stata utilizzata .... nessuna chiamata esplicita per il rilascio richiesta . –

Problemi correlati