2013-06-11 5 views
5

Я сделал приложение WPF с C#, используя MVVM Light framework. В моем приложении используется класс ViewModelLocator, чтобы найти режимы просмотра во время выполнения. В ViewModelLocator используется класс SimpleIoc, который также поставляется с MVVM Light framework.Как сбросить все экземпляры в контейнере IOC

Это мой сценарий: Пользователь может войти в систему, используя мое приложение. При выходе из системы я хочу удалить/восстановить/воссоздать все экземпляры viewmodel, чтобы обеспечить чистую среду для следующего пользователя.

Я попытался реализовать метод Cleanup() в классе ViewModelLocator, но он не работает. Не работает означает, что (второй) пользователь видит данные от пользователя, который ранее регистрировался.

первой попытки:

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

вторая попытка:

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

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

третья попытка (не то, что я хочу, но это обходной путь):

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

Как сбросить я все экземпляров в моем классе ViewModelLocator? В случае необходимости я готов использовать более продвинутый контейнер Ioc.

+0

Что случилось с третьим подходом? Можно ли повторно использовать объекты? – Romoku

+0

У меня есть некоторая логика в моих конструкторах, которые готовят некоторые вещи для текущего пользователя. Это не сработает. Мне также нужно написать много кода, который необходимо сохранить (метод очистки для каждой модели просмотра). Подход, чтобы выбросить старые примеры, кажется мне гораздо более понятным. – Joel

+0

В соответствии с поддержкой MVVM Light это рекомендуемый подход. [SimpleIoc - может ли он предоставлять новый экземпляр каждый раз?] (Http://stackoverflow.com/a/9350917/580951). Если это не соответствует вашей архитектуре, тогда лучше переключиться на другую МОК. – Romoku

ответ

4

С SimpleIoC

Я хотел бы добавить общественное статическое свойство с отдельной строки бэкэндом для уникального Key

что-то вроде

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

и есть метод очистки, чтобы разрегистрировать ВМ с током ключа и, наконец, сбросить текущий ключ (вызвать на каждом этапе перезагрузки приложения):

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

и при звонке GetInstance(...) просто пройдите в статическом CurrentKey.

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

работал для меня, но я по-прежнему предпочитаю менять контейнер IOC. Тем не менее это рабочее решение и, следовательно, правильный ответ. – Joel

+0

@ Хорошо, если вы решите изменить контейнер IoC на более сложный, вы можете принять Unity, где вы можете предоставить своим экземплярам 'ExternallyControlledLifetimeManager', который просто позволит мусору GC собирать экземпляр виртуальной машины, когда ничего не происходит сильная ссылка на него после выхода из системы.У вас есть еще несколько Менеджеров, чтобы управлять временем жизни ваших объектов. однако в «SimpleIoC» нет абсолютно ничего «неправильного» в отношении этого – Viv

+0

Да, теперь я использую Unity. Это было не о том, правильно или неправильно, что «SimpeIoC» не соответствует всем моим потребностям. – Joel

Смежные вопросы