2016-08-16 1 views
3

Ich habe einen Dienst, der Statistiken für eine Verkaufsregion abruft. Der Dienst berechnet die Statistiken für ALLE Regionen und speichert dann diese Sammlung und gibt dann nur die angeforderte Region zurück.MemoryCacheClient funktioniert anders als andere - Referenz beibehalten

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; 
} 

Was ich bin Befund ist, dass, wenn ich ein MemoryCacheClient verwenden (als Teil eines StaticAppHost, die ich für Unit-Tests verwenden), die Linie tots.Records.RemoveAll (...) tatsächlich das Objekt wirkt sich in der Cache. Das bedeutet, dass ich das zwischengespeicherte Objekt abrufe, Zeilen lösche und der Cache dann nicht mehr alle Regionen enthält. Daher geben nachfolgende Aufrufe an diesen Dienst für jede andere Region keine Datensätze zurück. Wenn ich meinen normalen Cache benutze, erstellt der Cache.Get() natürlich eine neue Kopie des Objekts im Cache, und das Entfernen von Datensätzen von diesem Objekt hat keine Auswirkungen auf den Cache.

Antwort

3

Dies liegt daran, dass ein In Memory-Cache keinen Serialisierungs-Overhead hinzufügt und nur Ihre Objektinstanzen im Speicher speichert. Wenn Sie jedoch eine der anderen Caching Providers verwenden, werden Ihre Werte zuerst serialisiert und dann an den Remote-Caching-Provider gesendet. Wenn sie dann abgerufen werden, wird ihre Deserialisierung zurückgenommen, sodass nie dieselben Objektinstanzen wiederverwendet werden.

Wenn Sie auf mutiert zwischengespeicherten Werte planen werden Sie brauchen, um die Instanzen zu klonen, bevor sie mutieren, wenn Sie nicht manuell ICloneable implementieren möchten, können Sie serialisieren und deserialisieren sie mit:

var clone = TypeSerializer.Clone(obj); 
Verwandte Themen