Wpf 视图生命周期与视图注入-PRISM
我正在学习复合应用程序的概念。 我使用unity容器创建了prism应用程序。 我的一个区域配置为内容控制-在这个区域中,我只想显示单个视图 我正在以下一种方式使用视图注入:Wpf 视图生命周期与视图注入-PRISM,wpf,prism,region,Wpf,Prism,Region,我正在学习复合应用程序的概念。 我使用unity容器创建了prism应用程序。 我的一个区域配置为内容控制-在这个区域中,我只想显示单个视图 我正在以下一种方式使用视图注入: object lastView; // View injection IRegion region = regionManager.Regions["MainRegion"]; var ordersView = container.Resolve<OrdersView>();
object lastView;
// View injection
IRegion region = regionManager.Regions["MainRegion"];
var ordersView = container.Resolve<OrdersView>();
lastView = ordersView;
region.Add(ordersView, "OrdersView");
region.Activate(ordersView);
对象视图;
//视图注入
IRegion region=regionManager.Regions[“MainRegion”];
var ordersView=container.Resolve();
lastView=ordersView;
添加(ordersView,“ordersView”);
区域。激活(ordersView);
这使得该区域的视图频繁切换。
在Im切换视图之前,Im使用区域。删除(lastView)
而不是像上面的代码那样添加下一个视图
我不确定这是否是一个良好的实施,我有几个问题:
当我使用region.remove方法时,是否正在处理删除的视图?
因为如果不是在长时间运行之后,我将有严重的内存泄漏。
在避免内存泄漏的同时,在区域中实现单一视图的最佳方法是什么
感谢由于内存泄漏,我猜您是在谈论垃圾收集器是否将收集该视图-例如,当您删除它时,容器是否仍在引用它
在解析对象后,是否保留该对象的引用取决于注册该对象时使用的类型
简单回答您的问题-与RegisterType
一起使用的默认生存期管理器是TransientLifetimeManager,其中Unity为每个对Resolve或ResolveAll方法的调用创建所请求类型的新实例
您可能正在寻找的是外部控制的LifetimeManager:
此生存期管理器允许您向容器注册类型映射和现有对象,以便当您调用Resolve或ResolveAll方法或依赖机制基于属性或构造函数将实例注入其他类时,容器仅维护对其创建的对象的弱引用该类中的参数。这允许其他代码在内存中维护或处置对象,并允许您保持对现有对象生存期的控制,或允许其他机制控制生存期
如果您想控制视图的生存期,请考虑使用这个生命管理器使用<代码> RealStyType < /C>。 此外,根据-对已解析实例调用Dispose的唯一生存期管理器是ContainerControlled LifetimeManager(创建Singleton实例)和HierarchyCallifetimeManager。在这些情况下,只有在释放生存期管理器时才会调用
Dispose
。由于内存泄漏,我猜您指的是垃圾收集器是否将收集该视图-例如,当您删除它时,容器是否仍在引用它
在解析对象后,是否保留该对象的引用取决于注册该对象时使用的类型
简单回答您的问题-与RegisterType
一起使用的默认生存期管理器是TransientLifetimeManager,其中Unity为每个对Resolve或ResolveAll方法的调用创建所请求类型的新实例
您可能正在寻找的是外部控制的LifetimeManager:
此生存期管理器允许您向容器注册类型映射和现有对象,以便当您调用Resolve或ResolveAll方法或依赖机制基于属性或构造函数将实例注入其他类时,容器仅维护对其创建的对象的弱引用该类中的参数。这允许其他代码在内存中维护或处置对象,并允许您保持对现有对象生存期的控制,或允许其他机制控制生存期
如果您想控制视图的生存期,请考虑使用这个生命管理器使用<代码> RealStyType < /C>。 此外,根据-对已解析实例调用Dispose的唯一生存期管理器是ContainerControlled LifetimeManager(创建Singleton实例)和HierarchyCallifetimeManager。在这些情况下,只有在释放生存期管理器时才会调用
Dispose