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 app은 ILogOnViewModel 인터페이스와 연관된 첫 번째 화면으로 시작합니다. 그런 다음이 화면을 비활성화하고 IMessengerViewModel 인터페이스와 관련된 두 번째 화면을 활성화합니다.

ANTS 메모리 프로파일 러를 사용하여 메모리 사용량을 확인하지만 ILogOnViewModel 인스턴스는 여전히 살아 계십니다. 사용자가 살아 있습니다.

IoC, DI의 초보자입니다. MEF와 함께 내보내는 모든 클래스는 전체 WPF 응용 프로그램 수명주기 동안 살아야합니까?

다른 예를 들어, 창 관리자를 사용하여 새 wpf 창을 만듭니다.

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

ChatViewModel은 WPF Window입니다.

IChatViewModel의 인스턴스를 만듭니다

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

가 그럼 난 (X 클릭 (닫기) 창에서 버튼)를 닫습니다 WPF 창, ChatViewModel는 를 비활성화하지만이 클래스의 instace은 여전히 ​​살아있다.

이 인스톨레이션을 죽일/파괴하는 방법은 존재합니까?

답변

1

MEF의 용기는 그래서 관계없이 CreationPolicy 컨테이너의 Dispose 방법에 대한 최종 호출 (모든 Export 인스턴스 처분합니다 (기본값은 Shared입니다) 사용되는 귀하의 수출의 수명 관리를 담당하는 랩 실제 클래스 인스턴스). 또한 Export 인스턴스에서 Dispose을 호출하면 실제 클래스 인스턴스도 삭제됩니다.

GC는 개체 그래프를보고 특정 인스턴스에 대한 참조가 0 개 이상 있는지 확인합니다. 참조는 MEF CompositionContainer (Export으로 마무리 됨)에 의해 유지 관리되므로 유지됩니다. 해당 항목을 처분하지 마십시오.

IDisposable이 플러그인에 구현 된 경우 (예 :

public interface ILogOnViewModel : IDisposable { } 

그리고 처분 패턴을 구현할 때, 당신이 그것을 여러 번 호출 할 수 있는지 확인하십시오

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

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

그런 다음 안전 문제를 일으키지 않고 ILogOnViewModel 구현의 인스턴스에 Dispose를 호출 할 수 있습니다를 할 때 실제 컨테이너가 처리됩니다.

+0

예, 컨테이너가 폐기 될 때까지 객체가 해제되지 않습니다. 이는 상당히 제한적입니다. –

관련 문제