2011-01-14 10 views
7

Ich versuche, eine Lösung zu konvertieren, die EntLib verwendet, um AppFabric-Caching zu verwenden. Mit Hilfe einiger Erweiterungsmethoden ist dies ein ziemlich schmerzfreier Prozess.ASP.Net AppFabric Cache fehlt Flush/Clear und Count/GetCount Methoden?

Erweiterungsmethoden verwende ich:

public static bool Contains(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key) != null; 
} 

public static object GetData(this DataCache dataCache, string key) 
{ 
    return dataCache.Get(key); 
}

Aber es gibt zwei Merkmale von EntLib ich schwer zu konvertieren finden. Nämlich "Count" (zählt die Anzahl der Schlüssel im Cache) und "Flush" (entfernt alle Daten aus dem Cache). Beide könnten gelöst werden, wenn ich die Schlüssel im Cache iterieren könnte.

Es gibt eine Methode namens ClearRegion(string region), aber das verlangte von mir, einen Gebietsnamen auf allen Get/Put/Add-Methoden anzugeben, die einige manuelle fehleranfällige Arbeit erfordern würden.

Gibt es eine Möglichkeit, eine Liste der Schlüssel im Cache zu erhalten?
Gibt es einen Standard-Regionsnamen, den ich verwenden kann?
Wie kann ich den Cache leeren, wenn ich keinen Gebietsnamen verwendet habe?

+0

Der Code erlaubte mir, ".Count == 0" mit der obigen Methode .Contains() zu ersetzen. –

Antwort

10

Siehe my previous answer für meine Spekulation, wie der Cache arbeitet intern, wenn Sie nicht über eine Region angeben und wie Sie die Anzahl der Objekte erhalten können, die nicht in einer benannten Region.

Wir können einen Flush-Methode bauen mit der gleichen Technik:

public void Flush (this DataCache cache) 
{ 
    foreach (string regionName in cache.GetSystemRegions()) 
    {  
     cache.ClearRegion(regionName) 
    } 
} 

Als ich dort gesagt, ich glaube, genannt Regionen wahrscheinlich der Weg zu gehen sind - so scheint es mir, dass sie mit mehr Probleme löst als es schafft.

+0

Danke. Es scheint, dass es automatisch eine ganze Reihe von Regionen erstellt hat. Default_Region_0000 bis Default_Region_1023. Alle löschen zeigt an, dass sie leer sind (Get-CacheStatistics). –

+10

Wenn Sie Regionen verwenden, verlieren Sie den verteilten Teil des Caches, da Regionen auf nur einem Cache-Host erstellt werden. Ich denke, im Allgemeinen möchten Sie sich von Regionen fernhalten, es sei denn, Sie haben einen sehr spezifischen Grund, sie zu verwenden (d. H. Tags). –

0

Wenn jemand in Zukunft Probleme haben wird (wie ich) - hier ist der vollständige Code zum Löschen des Cache.

private static DataCacheFactory _factory; 
     private const String serverName = "<machineName>"; 
     private const String cacheName = "<cacheName>"; 

     static void Main(string[] args) 
     { 
      Dictionary<String, Int32> cacheHostsAndPorts = new Dictionary<String, Int32> { { serverName, 22233 } }; 
      Initialize(cacheHostsAndPorts); 
      DataCache cache = _factory.GetCache(cacheName); 
      FlushCache(cache); 
      Console.WriteLine("Done"); 
      Console.ReadLine(); 
     } 

     private static void FlushCache(DataCache cache) 
     { 
      foreach (string regionName in cache.GetSystemRegions()) 
      { 
       cache.ClearRegion(regionName); 
      } 
     } 

     public static void Initialize(Dictionary<String, Int32> cacheHostsAndPorts) 
     { 
      var factoryConfig = new DataCacheFactoryConfiguration 
      { 
       Servers = cacheHostsAndPorts.Select(cacheEndpoint => new DataCacheServerEndpoint(cacheEndpoint.Key, cacheEndpoint.Value)) 
      }; 

      _factory = new DataCacheFactory(factoryConfig); 
     }