c# - 在 Caliburn Micro 和 CaSTLe Windsor 中处理 ViewModel

标签 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) 的干净/优雅的方式。似乎没有任何钩子(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/

相关文章:

c# - 如何使用 EWS 获取电子邮件的收件人

c# - 无需 PredicateBuilder 将动态谓词添加到表达式

caliburn.micro - 如何使用 Caliburn Micro 的简单容器注册特定的单例实例?

wpf - WPF 中 .NET (Rx) 的响应式扩展 - MVVM

c# - 从MVVM中的代码设置WPF延迟

javascript - 如何在 javascript 的 FormData 中追加对象?

c# - WPF如何更改gridview的标题颜色

c# - 网络表单和依赖注入(inject)

c# - CaSTLe Windsor 注册匹配相同服务的组件

inversion-of-control - CaSTLe Windsor 或 Spring.NET - 优缺点