В основном, я беспокоюсь о нескольких вещах:
[Export]
public class FooViewModel : NotificationObject
{
[Import]
public IService1 Service1 { get; set; }
[Import]
public IService2 Service2 { get; set; }
[Import]
public BarViewModel MyBar { get; set; }
etc.
//This is already initialized
public ObservableCollection<NotificationObject> CollectionOfViewModels { get; set; }
public void SetupViewModels1()
{
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(MyBar);
CollectionOfViewModels.Add(MyOtherBar);
CollectionOfViewModels.Add(My3rdViewModel);
etc.
}
public void SetupViewModels2()
{
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(MyBar);
CollectionOfViewModels.Add(My4thViewModel);
etc.
}
}
[Export]
public class BarViewModel : NotificationObject
{
[Import]
public IService1 Service1 { get; set; }
[Import]
public IService2 Service2 { get; set; }
//This is initialized and then the user starts adding values to it.
public ObservableCollection<Object> SomeObjects { get; set; }
public void DoSomething() { ... }
}
(1) Проблема № 1, я загружаю свою FooViewModel, и все хорошо и модно. Я решил загрузить свой первый набор ViewModels, чтобы поработать с ними. Затем, когда я загружаю свой второй набор ViewModels, BarViewModel остается тем же экземпляром (поэтому все его свойства одинаковы, включая свойство SomeObjects
. Как вы говорите ему повторно инициализировать себя, чтобы все его данные были очищены? Если вместо этого я делаю MyBar = new MyBar()
, то MyBar не инициализирует IService1
или IService2
(потому что MEF не инициализировал его, я сделал).
(2) Проблема № 2. Когда я не использую свои другие модели ViewModel, они все еще находятся в памяти, потому что я импортировал их с MEF, что означает, что их состояния также находятся там, что означает, что большие большие коллекции сидят и едят в моей памяти. Как полностью избавиться от ViewModel, когда вы его больше не используете?
Видите ли, прежде чем использовать MEF, я бы сделал следующее:
CollectionOfViewModels.Clear();
CollectionOfViewModels.Add(new MyBar());
etc.
Это будет означать, что когда я сделаю свой следующий набор ViewModels, как только я CollectionOfViewModels.Clear();
, на любую из ViewModels, которые были в коллекции, больше не ссылаются, и GC собирает их. В настоящее время это фактически не избавляет от ViewModels.