我正在学习复合应用程序的概念。 我使用统一容器创建了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方法时,被删除的视图是否被处理? 因为如果不是长时间运行后我会有严重的内存泄漏。 在避免内存泄漏的同时在区域中实现单个视图的最佳方法是什么?
由于
答案 0 :(得分:4)
通过内存泄漏我猜你在谈论垃圾收集器是否会收集该视图 - 例如是删除它时仍然引用它的容器。
决定是否在解析对象后保留对象的引用是基于您在注册该对象时使用的LifeTime Manager的类型。
要尽快回答您的问题 - 与RegisterType
一起使用的默认LifeTime管理器是 TransientLifetimeManager ,其中Unity为所请求类型创建新实例每次调用Resolve或ResolveAll方法。
您可能正在寻找的是 ExternallyControlledLifetimeManager :
此生命周期管理器允许您使用容器注册类型映射和现有对象,以便在调用Resolve时保持 仅对其创建的对象的弱引用 或者ResolveAll方法,或者当依赖机制根据该类中的属性或构造函数参数将实例注入其他类时。这允许其他代码将对象维护在内存中或对其进行处理,并使您能够保持对现有对象的生命周期的控制,或允许其他一些机制来控制生命周期。
如果您想控制视图的生命周期,请考虑在此LifeTime Manager中使用RegisterType
。
此外,根据this article - 在已解析的实例上调用Dispose的唯一生命周期管理器是 ContainerControlledLifetimeManager (创建singelton实例)和 HierarchicalLifetimeManager 。在这些情况下,只有在处理生命周期管理器时才会调用Dispose
。