如何处理与Caliburn Micro一起使用的Autofac容器

时间:2012-05-01 16:28:58

标签: dispose autofac caliburn.micro

我有一个Winforms菜单项,单击时会弹出一个WPF表单。 WPF表单使用Caliburn Micro,使用Autofac进行自举。

最近我发现Caliburn引导程序解析了根Autofac容器的依赖关系。因此,这些依赖项(例如,包含1000个数据项的视图模型将被绑定到网格)永远不会被丢弃。

我想使用Autofac lifetimescope容器来管理配置,但是,我不知道如何使用Caliburn来实现这一点。最初,我想为每个打开的WPF表单实例化一个Caliburn引导程序(带有自己的Autofac lifetimescope容器)。然后,当放置模板时,可以放置自举器(和带有它的寿命镜容器)。

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

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

1 个答案:

答案 0 :(得分: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...
        }
    }