我在 Caliburn-Micro Silverlight 应用程序中使用 CaSTLe-Windsor 作为我的容器。我的 ViewModel 对象相当笨重,因为它们调用 WCF 服务和其他一些东西。因此,当一个窗口关闭时,我想调用 container.Release(viewModel) 以便 CaSTLe 可以管理整个退役/处置过程,尊重配置的各种生命周期(如 this post 中所述)。
在我的 AppBootstrapper 中,我按如下方式覆盖了 GetInstance:
protected override object GetInstance(Type serviceType, string key)
{
if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType);
return container.Resolve(key, serviceType);
}
但我正在努力想出一种调用 container.Release(viewModel)
的干净/优雅的方式。似乎没有任何钩子(Hook)可用于此。
在 Caliburn Micro 应用中释放从 ViewModelLocator 返回的 ViewModel 对象的最简单方法是什么?
最佳答案
您想要的每种 VM 类型的生命周期都会在这里产生影响,因此对于您提供的上下文并没有真正正确的答案。
CM 的Screen
基类为您提供protected virtual void OnDeactivate(bool close);
,这是一个很好的起点。对于您的重量级 VM,您应该重写此方法,如果 close 参数指示 VM 正在关闭,则释放任何需要处理的资源(WCF channel 等),这将包括处理资源(如果 IDisposable
是相关的)并且还断开对它的任何引用,以便它可以被 GC 清理。
我不使用 CaSTLe,因此无法在配置生命周期等方面为您提供帮助。但如果您遵循上述内容,您将不会持有任何重量级的东西。我假设通过正确的生命周期配置,CaSTLe 将清除所有您不会再次使用的旧实例,而无需显式调用 Release
。
关于c# - 在 Caliburn Micro 和 CaSTLe Windsor 中处理 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583760/