2012-09-24 3 views
7

J'utilise un HttpRuntime.Cache pour stocker une liste d'objets qui accèderont fréquemment à travers les sessions.Lire l'élément HttpRuntime.Cache en lecture seule

J'utilise la ligne de code suivante pour obtenir l'élément du cache:

List<chartData_Type> _chartData = 
      (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth"); 

Mais, malheureusement, quand je mets à jour le _chartData, il met à jour aussi l'élément mis en cache.

Comment puis-je simplement obtenir une copie de l'élément mis en cache?

Répondre

6

C'est la façon dont fonctionne .NET parce cache juste référence au pointeur de List. Je ne sais pas si vous chartData_Type est le type de valeur ou le type de référence.

Si le type de valeur, il est facile à utiliser:

List<chartData_Type> list = new List<chartData_Type>(_chartData); 

Mais si le type de référence, il est trop compliqué, vous devez mettre en œuvre DeepCopy méthode pour votre classe, puis faire DeepCopy pour chaque objet liste.

méthode DeepClone:

public static class CloneHelper 
{ 
    public static T DeepClone<T>(T obj) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var formatter = new BinaryFormatter(); 
      formatter.Serialize(ms, obj); 
      ms.Position = 0; 

      return (T) formatter.Deserialize(ms); 
     } 
    } 
} 

Pour utiliser cette méthode, classe chartData_Type doit être marquée [Serializable]:

[Serializable] 
class chartData_Type 
{} 

Ainsi, vous pouvez faire clone en profondeur manuellement:

var cloneChartData = _chartData.Select(d => 
             CloneHelper.DeepClone<chartData_Type>(d)) 
         .ToList(); 
+0

Je me demande si AppFabric ou NCache pourraient résoudre ce problème. J'ai demandé cela dans un autre fil: http://stackoverflow.com/questions/23546817/appfabric-ncache-will-these-solve-httpruntime-cache-objects-being-updated-by-r – DrGriff

1

Utilisation:

List<chartData_Type> list = new List<chartData_Type>(_chartData); 

Il copiera tous les articles _chartData-list.

+0

Notez que ce sera une copie profonde de l'objet, donc vous devrez faire su re que le cache et cette copie restent synchronisés sinon ... OOOOOPS! –

+0

Peut-être une petite explication sur la raison pour laquelle sa copie met également à jour la version du cache. Je vais me lever = P –

1

La liste est un type de référence et _chartData contient l'adresse de l'objet original stocké dans le cache. C'est pourquoi, lorsque vous mettez à jour _chartData, il met également à jour l'objet mis en cache. Si vous voulez un objet séparé, clonez l'objet mis en cache. Voir ci-dessous référence

http://www.codeproject.com/Articles/33364/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca

http://www.codeproject.com/Articles/45168/ASP-NET-Runtime-Cache-Clone-Objects-to-Preserve-Ca