Wpf PRISM一次性模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wpf PRISM一次性模块相关的知识,希望对你有一定的参考价值。

我有一个分为PRISM模块的WPF应用程序。

我有一个处理一些非托管资源的服务,因此它实现了IDisposable接口:

public class MyCacheService : IMyCacheService, IDisposable
{
    ...
}

我还有一个注册IMyCacheService实例的CameraServicesModule:

public class CameraServicesModule : IModule
{
    public CameraServicesModule(IComponentsManager manager)
    {
        this.manager = manager;
    }

    public void Initialize()
    {
       ...
       var theCacheService = new MyCacheService();
       this.manager.RegisterInstance(typeof(IMyCacheService), null, theCacheService);
    }
}

问题是:我如何处置服务实例?我必须在应用程序关闭时执行此操作,但是现在不会在应用程序关闭(或任何其他时间点)调用MyCacheService.Dispose()。

CameraServicesModule也应该实现IDisposable吗?像这样:

public class CameraServicesModule : IModule, IDisposable
{
    public CameraServicesModule(IComponentsManager manager)
    {
        this.manager = manager;
    }

    public void Initialize()
    {
       ...
       this.theCacheService = new MyCacheService();
       this.manager.RegisterInstance(typeof(IMyCacheService), null, theCacheService);
    }

    public void Dispose()
    {
        this.theCacheService.Dispose();
    }
}

如果是这样,问题是:我该如何处理模块?如果没有,问题是:我应该采用哪种方式提供服务?

 LocalFileSystemConfigurationManager configManager = new LocalFileSystemConfigurationManager(this.PathToSettings);
 ComponentsManager compManager = new ComponentsManager(configManager, null, null);

注意:即使我的模块实现了IDisposable,处理componentsManager或configurationManager也不会处理该模块。

答案

好的,在咨询了一些高级开发人员后,我得出结论,处理服务的最合适的方法是在创建服务实例的模块上实现IDisposable:

public class CameraServicesModule : IModule, IDisposable
{
    public CameraServicesModule(IComponentsManager manager)
    {
        this.manager = manager;
    }

    public void Initialize()
    {
       ...
       this.theCacheService = new MyCacheService();
       this.manager.RegisterInstance(typeof(IMyCacheService), null, theCacheService);
    }

    public void Dispose()
    {
        this.theCacheService.Dispose();
    }
}

虽然模块实现了IDisposable,但我们可以保持原样,无需手动调用Dispose。该模块应该存在,直到应用程序工作(至少在我的情况下),因此所有分配的资源无论如何都会在应用程序关闭时释放。

以上是关于Wpf PRISM一次性模块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prism 的 Wpf 中模块之间的 ApplicationCommands 问题

Prism/MVVM (MEF/WPF):从模块中公开导航 [例如菜单]

2021-10-13 WPF上位机 64-Prism框架模块化(Module,Dialog)

使用 WPF / Prism 在应用程序退出/崩溃时处理对象实例

2021-10-11 WPF上位机 63-Prism框架模块化(Shell,Region)

wpf中如何把两个模块的内容放在一个类