2013-06-11 15 views
5

Ich habe eine C# -WPF-Anwendung mit der MVVM Light framework erstellt. Meine Anwendung verwendet die Klasse ViewModelLocator, um die Ansichtsmodelle zur Laufzeit zu finden. Die ViewModelLocator macht Gebrauch von der SimpleIoc Klasse, die auch mit der MVVM Light framework kommt.Zurücksetzen aller Instanzen im IOC-Container

Hier ist mein Szenario: Der Benutzer meldet sich an und kann meine Anwendung verwenden. Beim Abmelden möchte ich alle Viewmodel-Instanzen ablegen/zurücksetzen/neu erstellen, um dem nächsten Benutzer eine saubere Umgebung zu bieten.

Ich habe versucht, die Cleanup() Methode in der ViewModelLocator Klasse zu implementieren, aber es funktioniert nicht. Nicht arbeiten bedeutet, dass der (zweite) Benutzer die Daten des Benutzers sieht, der zuvor angemeldet war.

erster Versuch:

public static void Cleanup() 
{ 
    SimpleIoc.Default.Reset(); 
} 

zweiter Versuch:

public static void Cleanup() 
{ 
    SimpleIoc.Default.Unregister<LoginViewModel>(); 
    SimpleIoc.Default.Unregister<TaskViewModel>(); 

    SimpleIoc.Default.Register<LoginViewModel>(); 
    SimpleIoc.Default.Register<TaskViewModel>(); 
} 

dritter Versuch (nicht das, was ich will, aber es ist eine Abhilfe):

public static void Cleanup() 
{ 
    // I implemented the ICleanup interface in my viewmodels 
    // The cleanup method clears all my variables eg: myCollection.clear(); 
    SimpleIoc.Default.GetInstance<LoginViewModel>().Cleanup(); 
    SimpleIoc.Default.GetInstance<TaskViewModel>().Cleanup(); 
} 

Wie ich alle zurückgesetzt habe Instanzen in meiner ViewModelLocator Klasse? Ich bin bereit, bei Bedarf einen fortgeschritteneren Ioc Container zu verwenden.

+0

Was ist los mit dem dritten Ansatz? Können die Objekte nicht wiederverwendet werden? – Romoku

+0

Ich habe einige Logik in meinen Konstruktoren, die einige Dinge für den aktuellen Benutzer vorbereiten. Das wird nicht mehr funktionieren. Ich muss auch viel Code schreiben, der gepflegt werden muss (Bereinigungsmethode für jedes Viewmodel). Der Ansatz, die alten Instanzen wegzuwerfen, scheint mir viel einfacher zu sein. – Joel

+0

Dies ist laut MVVM Light Maintainer der empfohlene Ansatz. [SimpleIoc - Kann es jedes Mal eine neue Instanz bereitstellen?] (Http://stackoverflow.com/a/9350917/580951). Wenn das nicht zu Ihrer Architektur passt, ist es möglicherweise besser, zu einem anderen IOC zu wechseln. – Romoku

Antwort

4

Mit SimpleIoC

ich eine öffentliche statische Eigenschaft mit einem privaten String-Backend für eine einzigartige Key

etwas hinzufügen möchten

private static string _currentKey = System.Guid.NewGuid().ToString(); 
public static string CurrentKey { 
    get { 
    return _currentKey; 
    } 
    private set { 
    _currentKey = value; 
    } 
} 

und haben die Bereinigungsverfahren VM deregistrieren mit Strom Taste drücken und schließlich die aktuelle Taste zurücksetzen (in jeder App-Reset-Stufe aufrufen):

public static void Cleanup() { 
    SimpleIoc.Default.Unregister<LoginViewModel>(CurrentKey); 
    ... 
    CurrentKey = System.Guid.NewGuid().ToString(); 
} 

und beim Aufruf GetInstance(...) einfach die statische CurrentKey übergeben.

SimpleIoc.Default.GetInstance<LoginViewModel>(ViewModelLocator.CurrentKey); 
+0

arbeitete für mich, aber ich bevorzuge immer noch den IOC Container zu ändern. Trotzdem ist dies eine funktionierende Lösung und daher die richtige Antwort. – Joel

+0

@Joel gut, wenn Sie den IoC-Container zu einem komplizierteren ändern, können Sie Unity nehmen, wo Sie Ihren Instanzen einen 'ExternallyControlledLifetimeManager' geben können, der den Garbage-Müll einfach die Instanz der VM sammeln lässt, sobald nichts mehr hat starker Bezug darauf nach dem Abmelden.Sie haben noch weitere Manager, um die Lebensdauer Ihrer Objekte zu verwalten. aber es gibt absolut nichts "falsches" in "SimpleIoC" in Bezug auf diese – Viv

+0

ja ich benutze jetzt Unity. Es ging nicht um richtig oder falsch, es war nur so, dass "SimpeIoC" nicht all meinen Bedürfnissen entspricht. – Joel