【发布时间】:2011-06-02 13:11:47
【问题描述】:
您好,我在 WPF 应用程序中使用 MEF 和 caliburn.micro。我想知道如何销毁使用 MEF 创建的实例。
例如简单的shell:
[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 内存分析器检查内存使用情况,但 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 被停用 但是这个类的实例仍然存在。
存在方式如何杀死/销毁这个实例?
【问题讨论】:
标签: ioc-container mef caliburn.micro memory-management