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.
Co jest nie tak z trzecim podejściem? Czy obiekty nie mogą być ponownie użyte? – Romoku
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
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