2012-05-01 108 views
4

我有一个Winforms菜单项,可以在点击时调出一个WPF表单。 WPF表格使用Caliburn Micro,由Autofac引导。如何处置与Caliburn Micro一起使用的Autofac容器

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

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

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

有没有人有关于WPF表单关闭时如何处理依赖关系的建议/建议?

+0

我问了一个与Castle相关的问题。 http://stackoverflow.com/q/9583760/246811。至今还没有一个可行的答案。 –

+0

在问我的问题之前,我确实看到了您的帖子。像你一样,我正在寻找一种方法来做到这一点,而不会污染虚拟机。此外,我不知道为什么没有关于这个在线的更多信息 - 这似乎是使用Caliburn时的一个相当大的问题(至少对于Autofac和Castle,这是两种流行的DI框架)。 –

+0

同意。生命周期问题对VM的污染并不是我可以忍受的。 –

回答

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... 
     } 
    } 
+1

感谢分享。不幸的是,我不确定这是否适用于Autofac。 Autofac的生命周期管理方法主要围绕创建可在工作单元完成时处置的子容器。这意味着引导程序需要知道哪个子容器需要解析依赖关系,以及要处理哪个子容器。我还没有检查Autofac是否支持根容器中的container.Release样式方法。 –

相关问题