2016-08-16 8 views
3

私は営業地域の統計を取得するサービスを持っています。サービスはすべての領域の統計を計算し、そのコレクションをキャッシュし、要求された領域のみを返します。MemoryCacheClientは他のものと動作が異なります - 参照は保持されます

public object Any(RegionTotals request) 
{ 
    string cacheKey = "urn:RegionTotals";  

    //make sure master list is in the cache... 
    base.Request.ToOptimizedResultUsingCache<RegionTotals>(
     base.Cache, cacheKey, CacheExpiryTime.DailyLoad(),() => 
     { 
      return RegionTotalsFactory.GetObject(); 
     }); 

     //then retrieve them. This is all teams 
     RegionTotals tots = base.Cache.Get<RegionTotals>(cacheKey); 

     //remove all except requested 
     tots.Records.RemoveAll(o => o.RegionID != request.RegionID); 

     return tots; 
} 

私が発見だと、私は、ラインtots.Records.RemoveAll(...)(私はユニットテストのために使用StaticAppHostの一部として)MemoryCacheClientを使用する場合、実際にオブジェクトに影響を与えることがありますキャッシュ。これは、キャッシュされたオブジェクトを取得し、行を削除した後、キャッシュにすべての領域が含まれていないことを意味します。したがって、他の地域のこのサービスへのその後の呼び出しでは、レコードは返されません。通常のCacheを使用する場合、Cache.Get()はキャッシュ内のオブジェクトの新しいコピーを作成し、そのオブジェクトからレコードを削除してもキャッシュには影響しません。

答えて

3

これは、メモリ内キャッシュがシリアル化オーバーヘッドを追加せず、オブジェクトインスタンスをメモリに格納するだけであるためです。一方、他のいずれかを使用すると、値がシリアル化されてからリモートのキャッシングプロバイダに送信されます。取得されると、逆シリアル化されて同じオブジェクトインスタンスが再利用されることはありません。

あなたがキャッシュされた値を変異を計画している場合、あなたは手動でそれらをシリアライズし、デシリアライズすることができICloneableを実装したくない場合は、それらを変異する前にインスタンスのクローンを作成する必要があります:

​​
関連する問題