0

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を破棄してもモジュールは破棄されません。

4

1 に答える 1

0

上級開発者に相談した結果、サービスを破棄する最も適切な方法は、サービス インスタンスを作成するモジュールに 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 を呼び出さずにそのままにしておくことができます。モジュールは、アプリケーションが機能するまで存在する必要があるため(少なくとも私の場合)、割り当てられたすべてのリソースは、アプリケーションの終了時に解放されます。

于 2013-03-07T11:23:22.193 に答える