在Caliburn Micro和Castle Windsor中处理ViewModels

我在Caliburn-Micro Silverlight应用程序中使用Castle-Windsor作为我的容器。 我的ViewModel对象相当粗糙,因为它们调用WCF服务和其他一些东西。 因此,当窗口关闭时,我想调用container.Release(viewModel),以便Castle可以管理整个退役/处置过程,尊重配置的各种生命周期(如本文所述)。

在我的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对象的最简单方法是什么?

您希望每种VM类型的生命周期都会产生影响,因此您提供的上下文并没有真正正确的答案。

CM的Screen基类为您提供protected virtual void OnDeactivate(bool close); 这是一个很好的起点。 对于您的重量级虚拟机,您应该覆盖此方法,如果VM正在关闭参数指示关闭,则释放需要处理的任何资源(WCF通道等),这将包括处置资源(如果IDisposable相关)和同时断开对它的任何引用,以便GC可以清除它。

我没有使用Castle,所以我无法帮助你配置生命周期等。但如果按照上面的说法,你就不会坚持任何重量级的东西。 我假设使用正确的生命周期配置,Castle将清除任何您不会再次使用的旧实例,而无需显式调用Release