MEF - Как мне создать новую ViewModel (или сбросить ее состояние), если я использую MEF?Кроме того, как избежать проблем с памятью? - PullRequest
1 голос
/ 26 мая 2011

В основном, я беспокоюсь о нескольких вещах:

[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.

1 Ответ

3 голосов
/ 26 мая 2011

Вы знакомы с функциональностью MEF ExportFactory?Это позволяет вам создать новый экземпляр экспорта, а также выпустить его, когда вы закончите с ним.Это звучит как то, что вы хотите сделать здесь.

...