Trovo l’utilizzo di Unity (Dependency injection container) in coppia con Model-View-ViewModel semplicemente eccezionale: la pulizia e il risparmio di codice per iniettare le varie dipendenze “non ha prezzo” (cit.)
Un ulteriore esempio di come usare M-V-VM ‘paghi’ l’ho avuta oggi: Alcune pagine dell’applicazione Silverlight sulla quale sto lavorando devono essere ‘cachate’ ovvero devono mantenere lo stato quando l’utente navigando nell’applicazione ritorna in quella pagina, requisito inizialmente non previsto.
E’ bastato cambiare la modalità con cui viene istanziato il ViewModel da:

   1: this.container.RegisterType<EditAgenciesViewModel>();

in

   1: this.container.RegisterType<EditAgenciesViewModel>(new ContainerControlledLifetimeManager);

per ottenere il risultato visto che le View altro non sono che una rappresentazione passiva del relativo ViewModel.
L’unico problema era che, in alcuni casi, l’istanza deve essere ricreata, ecco quindi la necessità di un Custom LifeTime Manager che regoli il ciclo di vita dei viewmodels interessati.
Un custom lifetime manager altro non è che una classe che eredita da LifeTimeManager:

   1: public class DisposableLifetimeManager : LifetimeManager
   2:  {
   3:     private object cachedInstance;
   4:  
   5:     public override object GetValue()
   6:     {
   7:        return this.cachedInstance;
   8:     }
   9:  
  10:     public override void RemoveValue()
  11:     {
  12:        this.cachedInstance = null;
  13:     }
  14:  
  15:     public override void SetValue(object newValue)
  16:     {
  17:        this.cachedInstance = newValue;
  18:     }
  19:  }

Fatto questo il codice che registra il ViewModel in Unity diventa quindi:

   1: this.container.RegisterType<EditAgenciesViewModel>(this.CreateDisposableLifeTimeManager());
   2:  
   3: private DisposableLifetimeManager CreateDisposableLifeTimeManager()
   4: {
   5:    DisposableLifetimeManager newManager = new DisposableLifetimeManager();
   6:    this.disposableLifetimeManagers.Add(newManager);
   7:    return newManager;
   8: }

Il metodo CreateDispoableLifeTimeManager memorizza in una lista i managers creati permettendo quindi un eventuale ‘Reset’ della istanza associata quando necessario.

Semplice e, sopratutto, funzionale.

Technorati Tags: ,