【问题标题】:Disposing of ViewModels in Caliburn Micro and Castle Windsor在 Caliburn Micro 和 Castle Windsor 中处理 ViewModel
【发布时间】:2012-03-23 22:26:24
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您想要的每种 VM 类型的生命周期都会在这里产生影响,因此对于您提供的上下文并没有真正的正确答案。

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

    我不使用 Castle,所以在配置生命周期等方面我无法为您提供帮助。但是,如果您遵循上述内容,您将不会坚持任何重量级的事情。我假设在正确的生命周期配置下,Castle 将清理任何您不会再次使用的旧实例,而无需显式调用 Release

    【讨论】:

    • 非常感谢@Simon。我一直在探索 OnDeactivate 路线作为挂钩的地方。是的,如果您的 VM 具有很长的构造函数参数列表,Castle 将满足该组件构造函数的所有依赖项。然后,当组件为 Release()d 时,Castle 将根据为每个依赖项配置的生活方式释放所有依赖项。这里重要的是,Vms 本身不负责任何清理工作——这一切都是自动的。
    • 将责任推给虚拟机本身可能会奏效,但这意味着虚拟机开始受到生命周期责任的污染,我真的希望尽可能避免这些责任。理想情况下,Release 的责任应该与 Resolve 的责任一起存在——即调用堆栈的更高层、引导程序或容器本身......
    • 是的,这就是我的意思,例如,如果您将 VM 类型配置为“一次性使用”的生命周期(Castle 中映射到的内容),那么下次您请求实例时对于那种类型,容器应该只释放使用过的实例,因为它已经被使用过......不需要显式调用释放。
    • 根据您的 WCF 服务示例,您的 VM 可能具有用于在其参数列表中创建 WCF 通道的工厂抽象。 Castle 会为你注入那个工厂,但是这样的东西应该有更长的生命周期,你不应该释放它。只要您在 OnDeactivate 中处理并断开通过该工厂创建的任何通道,您就应该很好。有意义吗?
    • 谢谢@Simon。为了使模式可靠地工作,我们需要确保 Release() 与每个 Resolve() 配对 - 这样容器可以确保根据配置的生命周期正确停用组件。即使组件是“瞬态的”(Castle 为一次性使用),这也适用。对于您提出的 WCF 服务示例,我只是希望我的 VM 声明一个构造函数要求,例如 ISomeService。 VM 不需要任何关于它自己的生命周期或 ISomeService 生命周期的知识。
    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多