안녕하세요. 저는 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은 여전히 살아있다.
이 인스톨레이션을 죽일/파괴하는 방법은 존재합니까?
예, 컨테이너가 폐기 될 때까지 객체가 해제되지 않습니다. 이는 상당히 제한적입니다. –