【问题标题】:How to dispose of Autofac container used with Caliburn Micro如何处理与 Caliburn Micro 一起使用的 Autofac 容器
【发布时间】:2012-05-01 16:28:57
【问题描述】:

我有一个 Winforms 菜单项,单击该菜单项会显示 WPF 表单。 WPF 表单使用 Caliburn Micro,使用 Autofac 引导。

最近我突然想到 Caliburn 引导程序从根 Autofac 容器中解析依赖项。因此,这些依赖项(例如,具有 1000 个要绑定到网格的数据项的视图模型)永远不会被释放。

我想使用 Autofac 生命周期容器来管理处置,但是,我不确定如何使用 Caliburn 执行此操作。最初,我想为每个打开的 WPF 表单实例化一个 Caliburn 引导程序(带有自己的 Autofac 生命周期容器)。然后,当表单被释放时,引导程序可以被释放(以及生命周期容器)。

但是,从 Caliburn 源代码来看,似乎应该为整个应用程序只创建一个引导程序。这是因为实例化引导程序似乎会分配静态字段来处理 UI 编组(也许还有其他我可能没有看到的东西)。

对于关闭 WPF 表单时如何处理依赖项,是否有人有任何建议/建议?

【问题讨论】:

  • 我问了一个关于城堡的类似问题。 stackoverflow.com/q/9583760/246811。目前还没有一个可行的答案。
  • 在问我问题之前我确实看到了你的帖子。像你一样,我正在寻找一种不污染虚拟机的方法。此外,我不确定为什么在线上没有更多关于此的信息 - 使用 Caliburn 似乎是一个相当大的问题(至少对于 Autofac 和 Castle,它们是两个流行的 DI 框架)。
  • 同意。存在生命周期问题的虚拟机污染是我无法忍受的。

标签: dispose autofac caliburn.micro


【解决方案1】:

我目前正在使用以下内容发布从 Castle 解析的视图模型(直到出现更好的东西!)。我不熟悉 AutoFac,但也许这种方法可能有用。在您的引导程序中:

protected override object GetInstance(Type serviceType, string key)
{
        // Get the instance from the container
        ...

        // If it's activatable, monitor it so we can release when closed.
        IDeactivate activatable = result as IDeactivate;
        if (activatable != null)
        {
            activatable.Deactivated += activatable_Deactivated;
        }
        return result;
}

    void activatable_Deactivated(object sender, DeactivationEventArgs e)
    {
        if (e.WasClosed)
        {
            ((IDeactivate)sender).Deactivated -= activatable_Deactivated;
            container.Release(sender); // or whatever AutoFac equivalent is...
        }
    }

【讨论】:

  • 感谢分享。不幸的是,我不确定这是否适用于 Autofac。 Autofac 的生命周期管理方法以创建子容器为中心,这些子容器可以在完成一个工作单元时被释放。这意味着引导程序需要知道从哪个子容器解决依赖关系,以及要处理哪个子容器。我还没有检查 Autofac 是否支持容器。从根容器中释放样式方法。
猜你喜欢
  • 2016-04-06
  • 2019-02-06
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多