Ich implementiere einen Cache in einer Klassenbibliothek, die ich in einer asp.net-Anwendung verwende.
Ich habe mein Cache-Objekt als Singleton-Muster mit einer statischen Methode erstellt, um den Cache zu aktualisieren, der gerade eine Member-Variable / -Eigenschaft mit einer Sammlung von Daten lädt, die ich zwischenspeichern muss (habe natürlich eine gewisse Sperrlogik). Ich dachte, es wäre ein guter Weg, da ich einfach auf meine Daten zugreifen kann, indem ich
anrufe %Vor%Ich erstelle ein neues Cache-Objekt, um eine ziemlich große Menge von Daten zu speichern, die durch einen Schlüssel partitioniert sind. Was ich sage ist, dass ich einen neuen Cache erstelle, aber dieser lädt nicht alle Daten auf einmal, sondern speichert eine Sammlung für jeden Schlüssel, auf den zugegriffen wird.
%Vor%Diesmal wurde die Frage nach der Garbage Collection aufgeworfen. Da ich eine riesige Menge an Daten speichere, wäre es keine Verschwendung, wenn es plötzlich gc'te? Da es nur ein Singleton-Muster ist, gibt es nichts, was sicherstellt, dass Daten im Cache verbleiben.
Also meine Frage ist - Was ist die beste Vorgehensweise für die Implementierung eines Cache, um diese Situation zu behandeln? Ich mag wirklich keine große, komplexe Lösung dafür, und ich weiß, dass es in System.Web Caching gibt, aber das scheint ein bisschen "aus", da dies nur eine Klassenbibliothek ist, oder was denkst du?
Meiner Meinung nach hätte die beste Lösung die folgenden Eigenschaften:
Verwendet die verfügbaren Caching-Dienste, die von der Plattform bereitgestellt werden, um zu vermeiden, eigene zu schreiben.
Verbindet Ihre Klassenbibliothek nicht mit System.Web, damit die Ebenen kohärent sind.
Wenn die Klassenbibliothek jedoch in einer ASP.NET-Anwendung ausgeführt wird, sollte die Lösung keine weitere Caching-Implementierung benötigen (z. B. den Caching Application Block der Enterprise Library), was zusätzliche Konfiguration und Einrichtung erfordert / p>
Also würde ich eine IoC-Strategie verwenden, um der Klassenbibliothek zu erlauben, verschiedene Caching-Implementierungen zu verwenden, basierend auf der Umgebung, auf der sie läuft.
Angenommen, Sie definieren Ihren abstrakten Caching-Vertrag wie folgt:
%Vor%Sie könnten eine Implementierung basierend auf System.Web bereitstellen:
%Vor%Und dann muss diese Implementierung als Singleton veröffentlicht werden. Beachten Sie, dass der Unterschied zu Ihrem ursprünglichen Ansatz darin besteht, dass der Singleton nur ein Verweis auf die ASP.NET-Cache-Dienst-basierte Implementierung ist, anstatt auf das vollständige "Cache-Objekt".
%Vor%Sie müssten die Chaching-Implementierung initialisieren, indem Sie entweder eine lazy-Initialisierung durchführen oder beim Start der Anwendung (in global.asax.cs)
Und jede Domänenkomponente könnte den veröffentlichten Caching-Dienst verwenden, ohne zu wissen, dass er auf Basis von System.Web implementiert wurde.
%Vor%Ich stimme zu, dass es wahrscheinlich nicht die einfachste Lösung ist, aber ich möchte die ASP.NET-Cache-Implementierung nutzen, ohne Code-Entkopplung und Flexibilität zu opfern.
Ich hoffe, ich habe Ihre Frage richtig verstanden.
Die Daten würden keine Speicherbereinigung erhalten, solange der Cache noch einen Verweis darauf enthält.
Benutze auch niemals Singletons.
Tags und Links c# asp.net garbage-collection caching singleton