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?
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. –
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 ... –
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 . –