4

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

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

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

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

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

4

1 回答 1

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...
        }
    }
于 2012-05-01T23:44:26.547 回答