2011-01-02 3 views
1

Привет Я использую MEF и caliburn.micro в приложении WPF. Я хотел бы знать, как я могу уничтожить впадины, созданные с помощью MEF.Как уничтожить объекты, созданные с помощью MEF

Например, простой оболочки:

[Export(typeof(IShellViewModel))] 
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel 
    { 

     protected override void OnInitialize() 
     { 
      ShowLogOn(); 
      base.OnInitialize(); 
     } 

     //first screen 
     public void ShowLogOn() 
     { 
      var vm = IoC.Get<ILogOnViewModel>(); 
      ActivateItem(vm); 
     } 

     //second screen 
     public void ShowMessenger(Account account) 
     { 
      ActiveItem.Deactivate(true); 
      var vm = IoC.Get<IMessengerViewModel>(); 
      vm.Account = account; 
      ActivateItem(vm); 
     } 

    } 

Первый экран

[Export(typeof(ILogOnViewModel))] 
public class LogOnViewModel : Screen,ILogOnViewModel 
{ 
    User user=new User(); 
} 

Второй экран:

[Export(typeof(IMessengerViewModel))] 
      public class MessengerViewModel : Screen, IViewModelIdentity, 
       IMessengerViewModel, IHandle<Rp>, IHandle<string> 
      {..} 

WPF начало приложения с первого экрана, связанного с интерфейсом ILogOnViewModel. Затем я деактивирую этот экран и активирую второй экран, связанный с интерфейсом IMessengerViewModel.

Я проверяю использование памяти с помощью ANTI Mememory profiler, но instace из ILogOnViewModel все еще жив и нестабилен для класса. Пользователь жив.

Я новичок в IoC, DI ... все классы, которые экспортируются с помощью MEF, должны жить в течение всего цикла жизненного цикла приложения WPF?

Другой пример: я создаю новое окно wpf с оконным менеджером.

[Export(typeof(IChatViewModel))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class ChatViewModel : Screen, IViewModelIdentity, 
    IChatViewModel, IHandle<Rp>, IHandle<DetailData> 
{} 

ChatViewModel - это окно WPF.

Создать экземпляр IChatViewModel:

private IWindowManager _windowManager; 
var chatScreen = IoC.Get<IChatViewModel>(); 
_windowManager.Show(chatScreen); 

Тогда я закрываю (нажмите на кнопку X (закрыть) в окне) WPF Window, ChatViewModel деактивируется но instace этого класса все еще жив.

Он существует, как убить/уничтожить эти шрамы?

ответ

1

МЭФ контейнер отвечает за управление временем жизни вашего экспорта, поэтому независимо от CreationPolicy используется (по умолчанию Shared), окончательный вызов Dispose метод контейнера распорядится любых Export экземпляров (что обертка ваш фактический класс экземпляры). Кроме того, вызов Dispose на экземпляр Export приведет к тому, что фактический экземпляр класса также будет удален.

Важно помнить, является ГМ смотрют на графе объектов и определение, если есть 0 или более ссылок на этот конкретный случай, так как ссылка поддерживаются MEF CompositionContainer (завернутого в Export) он выиграл Не используйте этот предмет.

Если вы применяете то, что IDisposable реализовано в ваших плагинах, например.

public interface ILogOnViewModel : IDisposable { } 

И убедитесь, что при реализации Dispose шаблона, вы позволяете ему быть вызван несколько раз:

public void Dispose(bool disposing) 
{ 
    if (disposing && !disposed) 
    { 
     // Clean up? 
    } 
} 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SurpressFinalize(this); 
} 

Вы можете смело называть Dispose на вашем экземпляре вашей ILogOnViewModel реализации, не вызывая проблем, когда фактический контейнер.

+0

Да, но объект никогда не освобождается до тех пор, пока контейнер не будет установлен, что является довольно ограниченным. –

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