2017-07-27 1 views
1

Meine Webanwendung speichert eine Liste von Objekten, um zu vermeiden, dass sie immer wieder von einer Datenbank abgerufen werden müssen. Auf einer Seite wird die Liste aus dem Cache abgerufen und dann zusätzliche Objekte zur Liste hinzugefügt und in einem datengebundenen Steuerelement angezeigt. Diese zusätzlichen Objekte sollen nicht zwischengespeichert werden, sind aber trotzdem irgendwie.System.Web.Caching.Cache Verhalten

Wenn Sie die Cache.Get() -Methode verwenden, soll es eine Objektreferenz oder eine Kopie dieses Objekts zurückgeben?

Antwort

2

System.Web.Caching.Cache ist ein In-Memory-Cache. Das bedeutet, dass die Objektreferenzen von einem Aufruf zurückgegeben werden. Wenn Sie die Referenz ändern, nachdem Sie einen get ausgeführt haben, ändern Sie dasselbe Objekt, das sich noch im Cache befindet.

Sie müssen einen Kopiervorgang manuell durchführen, um das ursprüngliche Objekt nicht zu ändern.

+1

@CodeCaster Ich habe es neu formuliert, um "In-Memory" -Cache anstelle von nur "Speicher-Cache" zu sagen. Ich würde Memcached nicht "in-memory" nennen, weil es außerhalb des Prozesses liegt, aber bei den meisten Implementierungen von In-Memory-Caches speichern sie Referenzen nur, wenn sie alle Objekte im Cache serialisieren müssen (was ein gutes Zeichen dafür ist) Sie speichern nicht nur Referenzen). –

+0

Vielen Dank für Ihre Antwort! Ich dachte so viel, war mir aber nicht sicher. Ich bin gewohnt, die Session-Variable für solche Aufgaben früher zu verwenden. – Zachary

3

MSDN: Caching Application Data:

Das Cache-Objekt hat keine Informationen über den Inhalt der darin enthaltenen Elemente. Es enthält lediglich einen Verweis auf diese Objekte .

Wenn Sie eine Liste ändern möchten, ohne die im Cache gespeicherten Darstellung zu verändern, erstellen Sie einfach eine neue Liste der ursprünglichen Liste als Quelle verwenden:

var fromCache = Cache.Get("MyList") as List<Foo>; 
if (fromCache != null) 
{ 
    var listToModify = new List<Foo>(fromCache); 
    listToModifyAdd(new Foo { ... }); 
} 

beachten Sie, dass dies nur die Liste zwischengespeichert verhindert geändert wird, Änderungen an Objekten in die Liste wird immer noch von aufeinander folgenden Cache.Get() Aufrufe darstellen.

Wenn Sie das ebenfalls verhindern möchten, sehen Sie sich Deep cloning objects an.