2011-12-27 9 views
2

Microsoft Enterprise LibraryのCacheManagerを使用してIDisposableインターフェイスを実装するオブジェクトをキャッシュする方法を教えてください。EntLib CacheManagerとIDisposableオブジェクト

オブジェクトが期限切れになると、そのオブジェクトに対してDispose()が呼び出されることはなく、Remove(...)をオーバーライドすることはできません。

+0

あなたがキャッシュ内のオブジェクトのデストラクタで処分を呼び出すことができますか?あるいは、あなたはそのクラスのコードを所有していませんか? – rene

+0

私はこれらのクラスのコードを持っていますし、それは何とかハッキリを感じるが、それはショットを与えるだろう。 –

+0

完全に同意します – rene

答えて

2

Disposeを呼び出すのはキャッシュの責任である必要があることは完全にはわかりません。アイテムがキャッシュから削除されただけであっても、他の場所では参照されていないというわけではありません。

また、オブジェクトがIDisposableパターンを実装する場合、FinalizerはDispose(Disposeがまだ呼び出されていない場合)を呼び出す必要があります。

ただし、エンタープライズライブラリでは、必要と思われる操作を実行するためのフックを提供しています。インターフェイスはICacheItemRefreshActionインターフェイスです。アイテムがキャッシュから削除されると、ICacheItemRefreshAction.Refreshメソッドが別のスレッドで呼び出されます。

アイテムがキャッシュに追加されると、ICacheItemRefreshActionを指定できます。

その使い方の例:

[Serializable] 
public class DisposeRefreshAction : ICacheItemRefreshAction 
{ 
    public void Refresh(string key, object expiredValue, CacheItemRemovedReason removalReason) 
    { 
     // Item has been removed from cache. Perform desired actions here, based on 
     // the removal reason (for example, refresh the cache with the item). 
     if (expiredValue != null && expiredValue is IDisposable) 
     { 
      ((IDisposable)expiredValue).Dispose(); 
     } 

    } 
} 

public class MyClass : IDisposable 
{ 
    public void Dispose() 
    { 
     Console.WriteLine("Dispose!"); 
    } 
} 

var cache = EnterpriseLibraryContainer.Current.GetInstance<CacheManager>("Cache Manager"); 

cache.Add("myKey", new MyClass(), CacheItemPriority.Normal, 
    new DisposeRefreshAction(), new SlidingTime(TimeSpan.FromSeconds(2))); 
関連する問題