2

我正在学习复合应用程序的概念。我使用统一容器创建了 prism 应用程序。我的一个区域配置为内容控制 - 在这个区域中,我只想显示单个视图。

我正在以另一种方式使用视图注入:

object lastView;

    // View injection
    IRegion region = regionManager.Regions["MainRegion"];

    var ordersView = container.Resolve<OrdersView>();
    lastView = ordersView;
    region.Add(ordersView, "OrdersView");
    region.Activate(ordersView);

这个区域的视图经常切换。在我切换视图之前我使用region.remove(lastView) 并添加下一个视图,如上面的代码。

我不确定它是否是一个好的实现,我有几个问题:当我使用 region.remove 方法时,删除的视图是否正在处理?因为如果不是经过长时间运行,我将有严重的内存泄漏。在避免内存泄漏的同时,在区域中实现单一视图的最佳方法是什么?

谢谢

4

1 回答 1

4

通过内存泄漏,我猜您是在谈论垃圾收集器是否会收集该视图 - 例如,当您删除它时容器是否仍在引用它。

对象解析后是否保留引用的决定取决于您在注册该对象时使用的LifeTime Manager的类型。

尽快回答您的问题 - 使用的默认 LifeTime 管理器RegisterTypeTransientLifetimeManager,其中 Unity 为每次调用 Resolve 或 ResolveAll 方法创建一个请求类型的新实例

您可能正在寻找的是ExternallyControlledLifetimeManager

此生命周期管理器允许您向容器注册类型映射和现有对象,以便当您调用 Resolve 或 ResolveAll 方法或依赖机制将实例注入基于属性或的其他类时,它仅维护对其创建的对象的弱引用该类中的构造函数参数。这允许其他代码在内存中维护对象或释放它,并使您能够保持对现有对象的生命周期的控制或允许其他一些机制来控制生命周期。

如果您想控制视图的生命周期,请考虑将RegisterType与此 LifeTime Manager 一起使用。

此外,根据这篇文章- 在已解析实例上调用 Dispose 的唯一生命周期管理器是ContainerControlledLifetimeManager(它创建单例实例)和HierarchicalLifetimeManager。在这些情况下,Dispose只有在释放生命周期管理器时才会调用。

于 2012-12-13T08:33:26.367 回答