在Caliburn Micro和Castle Windsor中处理ViewModels

时间:2012-03-06 12:31:12

标签: c# castle-windsor caliburn.micro silverlight-5.0

我在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)。似乎没有任何钩子可用于此。

在Caliburn Micro应用程序中发布从ViewModelLocator返回的ViewModel对象的最简单方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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