嗨,我在 WPF 应用程序中使用 MEF 和 caliburn.micro。我想知道如何销毁使用 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 界面关联的第二个屏幕。
我使用 ANTS Mememory 分析器检查内存使用情况,但 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 窗口,ChatViewModel 已停用,但此类的实例仍然存在。
它存在方式如何杀死/销毁这个实例?