【问题标题】:Views lifetime with view injection - PRISM视图注入的视图生命周期 - PRISM
【发布时间】:2012-12-13 06:02:20
【问题描述】:

我正在学习复合应用程序的概念。 我使用统一容器创建了 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 方法时,被删除的视图是否正在处理? 因为如果不是经过长时间运行,我将有严重的内存泄漏。 在避免内存泄漏的同时,在区域中实现单一视图的最佳方法是什么?

谢谢

【问题讨论】:

    标签: wpf prism region


    【解决方案1】:

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

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

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

    您可能正在寻找的是 ExternallyControlledLifetimeManager

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

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

    另外,根据this article - 在已解析实例上调用 Dispose 的唯一生命周期管理器是 ContainerControlledLifetimeManager(创建单例实例)和 HierarchicalLifetimeManager。在这些情况下,Dispose 仅在生命周期管理器被释放时才被调用。

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2013-08-11
      • 1970-01-01
      相关资源
      最近更新 更多