2013-06-11 9 views
5

Zrobiłem aplikację C# WPF przy użyciu MVVM Light framework. Moja aplikacja używa klasy ViewModelLocator, aby zlokalizować viewmodels podczas wykonywania. Model ViewModelLocator używa klasy SimpleIoc, która jest również dostarczana z MVVM Light framework. To jest mój scenariusz: Użytkownik loguje się do mojej aplikacji. Po wylogowaniu chcę pozbyć się/zresetować/odtworzyć wszystkie instancje viewmodel, aby zapewnić czyste środowisko dla następnego użytkownika.Jak zresetować wszystkie wystąpienia w IOC Container

Próbowałem zastosować metodę Cleanup() w klasie ViewModelLocator, ale nie działa. Nie działa oznacza, że ​​(drugi) użytkownik widzi dane od użytkownika, który był wcześniej zalogowany.

pierwsza próba:

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

drugiej próbie:

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

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

trzecia próba (nie to, co chcę, ale to jest obejście):

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(); 
} 

Jak zresetować wszystko wystąpienia w mojej klasie ViewModelLocator? W razie potrzeby chcę użyć bardziej zaawansowanego kontenera Ioc.

+0

Co jest nie tak z trzecim podejściem? Czy obiekty nie mogą być ponownie użyte? – Romoku

+0

Mam trochę logiki w moich konstruktorów, którzy przygotowują pewne rzeczy dla bieżącego użytkownika. To już nie zadziała. Muszę też napisać dużo kodu, który należy zachować (metoda oczyszczania dla każdego modelu widoku). Podejście do wyrzucania starych instancji wydaje mi się dużo prostsze. – Joel

+0

Według opiekuna MVVM Light jest to zalecane podejście. [SimpleIoc - czy może dostarczyć nowej instancji za każdym razem, gdy jest to wymagane?] (Http://stackoverflow.com/a/9350917/580951). Jeśli to nie pasuje do twojej architektury, może lepiej przełączyć się na inny IOC. – Romoku

Odpowiedz

4

Z SimpleIoC

bym dodać obiekt statyczny publicznego z prywatnym backend ciąg wyjątkowego Key

coś podobnego

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

i mieć metodę oczyszczania w celu wyrejestrowania VM prądem i na koniec zresetować bieżący klucz (wywołać na każdym etapie resetowania aplikacji):

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

i po wywołaniu GetInstance(...) po prostu przekazać statyczny CurrentKey.

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

pracował dla mnie, ale nadal wolę zmieniać kontener IOC. Niemniej jednak jest to działające rozwiązanie, a zatem właściwa odpowiedź. – Joel

+0

@Joel dobrze, jeśli zdecydujesz się zmienić kontener IoC na bardziej skomplikowany, możesz wziąć Unity, gdzie możesz nadać swoim instancjom 'ExternallyControlledLifetimeManager', który po prostu pozwoli, aby śmieci GC zbierały instancje VM, gdy nic już nie ma silne odniesienie do niego po wylogowaniu.Masz również kilku Menedżerów, którzy zarządzają czasem życia twoich obiektów. jednakże w 'SimpleIoC' nie ma absolutnie nic" niewłaściwego "odnośnie tego – Viv

+0

tak, teraz używam Unity. Nie chodziło o dobro czy zło, tylko że "SimpeIoC" nie pasuje do wszystkich moich potrzeb. – Joel