我使用Castle-Windsor作为Caliburn-Micro Silverlight应用程序中的容器。我的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)。似乎没有任何可用的钩子来实现此目的。
在Caliburn Micro应用程序中释放从ViewModelLocator返回的ViewModel对象的最简单方法是什么?
发布于 2012-03-16 05:54:18
您想要的每种VM类型的生命周期将在这里产生影响,因此对于您提供的上下文,没有真正正确的答案。
CM的Screen基类提供了protected virtual void OnDeactivate(bool close);,这是一个很好的起点。对于重量级VM,您应该重写此方法,如果VM正在关闭,请释放需要释放的任何资源(WCF通道等),这将包括释放资源(如果IDisposable是相关的),并断开对它的任何引用,以便GC可以清除它。
我不使用Castle,所以我不能在配置生命周期等方面帮助你。但是如果你遵循上面的步骤,你将不会坚持任何重量级的东西。我假设,使用正确的生命周期配置,Castle将清除任何旧实例,如果不显式调用Release,这些实例将不会再使用。
https://stackoverflow.com/questions/9583760
复制相似问题