【问题标题】:Prism IDisposable Autofac and Lifetime ScopePrism IDisposable Autofac 和 Lifetime Scope
【发布时间】:2019-09-03 17:22:28
【问题描述】:

我正在使用 Prism 在我的 WPF 应用程序中的视图之间导航。特别是我使用 IRegionMemberLifetime.KeepAlive => 实现的一个视图返回 false;每次导航到视图时创建一个新的视图实例(出于显示原因,我们需要这样做)。此视图还包含一个自定义 win32 控件,我需要在使用 IDisposable.Dispose 时对其进行一些清理。当我导航到我的视图然后离开它时,我希望 Dispose 被调用(运行清理)。我可以通过实现这里讨论的自定义区域行为来实现这一点,https://github.com/PrismLibrary/Prism/issues/7。所有这一切都工作正常,除了所有东西都被标记为待处理,但 GC 实际上并没有摆脱任何东西。我使用 Autofac 作为我的 IOC 容器,经过一些研究后,我得出结论,原因归结为 Autofac 和 IDisposables 的生命周期范围,https://nblumhardt.com/2011/01/an-autofac-lifetime-primer/。基本上 Autofac 持有对 IDisposable 的引用,因此 GC 不会摆脱旧视图。例如,我在模块中将我的视图注册为 _container.RegisterTypeForNavigation();我无法在任何类型的生命周期内注册它,我不确定如何在指定的生命周期内解决这个问题?当我调用 RegionManager.RequestNavigate 时,我没有看到任何类型的重载来指定生命周期?任何想法将不胜感激。

【问题讨论】:

    标签: prism


    【解决方案1】:

    RegisterTypeForNavigation 本质上是builder.RegisterType(type).Named<object>(name);,当然,你也可以自己做,并应用你想要的任何生命。注册导航没有什么神奇之处,RegisterTypeForNavigation 只是一个简写。

    要让Autofac忽略IDisposables,可以写

    builder.RegisterType<SomeView>().Named<object>(typeof(SomeView).Name).ExternallyOwned();
    

    来自the docs

    禁用处置

    默认情况下,组件归容器所有,并会在适当的时候由它处置。要禁用此功能,请将组件注册为具有外部所有权:

    builder.RegisterType&lt;SomeComponent&gt;().ExternallyOwned();

    容器永远不会在注册有外部所有权的对象上调用Dispose()。您可以自行处置以这种方式注册的组件。

    【讨论】:

    • 所以我不知道这个,我尝试用这种方式实现注册,但仍然没有帮助。即使我将视图注册为 .InstancePerDependency(); Autofac 永远不会发布视图,因为当我调用 RequestNavigate() 时,我假设视图正在相同的生命周期范围内解析。我需要以某种方式调用 RequestNavigate() 并让它在新的生命周期范围内解析视图。
    • 对于视图模型,您可以在ViewModelLocationProvider 中设置一个新工厂。对于视图,您可以提供自己的RegionNavigationContentLoader 并覆盖CreateNewRegionItem
    【解决方案2】:

    所以扩展@Haukinger 的答案。这就是最终对我有用的方法:

    //builder.RegisterTypeForNavigation<SomeView>();
    builder.RegisterType<SomeView>().Named<object> 
    (typeof(SomeView).Name).ExternallyOwned();
    

    ExternallyOwned() 向 autofac 发出信号,表明用户将处理调用 dispose 并且 autofac 不应跟踪 IDisposable。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多