在Caliburn Micro和Castle Windsor中处理ViewModels

在Caliburn Micro和Castle Windsor中处理ViewModels

问题描述:

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

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

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

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

我不使用城堡,所以我不能帮你配置生命周期等。但如果你遵循上面的说法,你不会坚持任何重量。我假设在正确的生命周期配置下,Castle将清除任何旧的实例,如果没有明确地致电Release,它将自行重新使用。

+0

非常感谢@Simon。我一直在探索OnDeactivate路线作为一个挂钩的地方。是的,如果你有一个具有长构造函数参数列表的虚拟机,Castle将满足该构件的所有依赖关系。然后,当组件是Release()时,Castle将根据为其中每个人配置的生活方式释放所有依赖关系。这里重要的是Vms本身不负责任何清理工作 - 这全是自动的。 – 2012-03-15 22:02:37

+0

将责任推给虚拟机本身可能会起作用,但这意味着虚拟机开始受到生命周期责任的污染,如果可能的话,我真的希望避免这些责任。理想情况下,释放的责任应该承担解决的责任 - 即在调用堆栈中,在引导程序或容器本身中更高...... – 2012-03-15 22:06:59

+0

是的,就像我说的那样,作为一个例子,如果您将VM类型配置为“单次使用”的生命周期(任何在Castle中映射的内容),那么当下一次请求该类型的实例时,容器应该释放已使用过的实例,因为它已经被使用过了......没有明确的调用来释放。 – 2012-03-15 22:09:08