Implementieren von Cache korrekt in einer Klassenbibliothek für die Verwendung in einer asp.net Anwendung

StackOverflow https://stackoverflow.com/questions/156478

Frage

Ich bin die Implementierung eines Cache in einer Klassenbibliothek, die ich in einer asp.net Anwendung bin mit.

ich als Singletonmuster mit einer statischen Methode meines Cache-Objekt erstellt den Cache zu aktualisieren, die wirklich nur eine Membervariable / Immobilien mit einer Sammlung von Daten geladen i zwischengespeichert muss (hätte einige Verriegelungslogik ofcourse). Habe ich es eine schöne Art und Weise war zu gehen, da ich gerade meine Daten zugreifen, indem Aufruf

MyCacheObject.Instance.MyDataCollection

Ich erstelle ein neues Cache-Objekt eine ziemlich große Menge an Daten, die von einem gewissen Schlüssel aufgeteilt zu speichern. Was ich sagen will ist, ich bin ein neuer Cache zu schaffen, aber diese werden nicht alle Daten auf einmal laden, sondern speichern Sie eine Sammlung für jede Taste abgerufen.

MyOtherCacheObject.Instance.MyOtherDataCollection(indexkey)

Dieses Mal die Frage nach der Garbage Collection erzogen wurde. Da ich eine riesige Menge an Daten zu speichern, wäre es nicht eine Verschwendung, wenn es ganz plötzlich gc'ed wurde? Da es nur ein Singletonmuster Daten gibt es nichts gewährleistet im Cache bleiben.

Also meine Frage ist - was ist beste Praxis einen Cache für implemeting mit dieser Situation zu umgehen? Ich mag wirklich keine große komplexe Lösung dieses Problems, und ich weiß, gibt es Caching in System.Web aber das scheint ein wenig ‚off‘, da dies nur eine Klassenbibliothek ist, oder was meinst du?

War es hilfreich?

Lösung

Meiner Meinung nach ist die beste Lösung wäre, die folgenden Merkmale aufweist:

  • Verwendet den verfügbaren Caching-Service von der Plattform versuchen, Ihre eigenen zu vermeiden, zu schreiben.

  • Does not Paar Ihrer Klassenbibliothek System.Web, um die Schichten zu haben, kohärent.

  • Aber wenn die Klassenbibliothek befindet sich in einer ASP.NET-Anwendung ausgeführt wird, sollte die Lösung keine andere Caching-Implementierung bringen auf erfordern (zum Beispiel die Enterprise Library Caching Application Block), die zusätzliche Konfiguration und Einrichtung erfordert.

Also, ich würde eine IoC Strategie verwenden, um die Klassenbibliothek zu ermöglichen, verschiedene Caching-Implementierungen zu verwenden, bezogen auf die Umwelt es läuft.

Angenommen, Sie Ihren Abstract Caching Vertrag als definieren:

public interface ICacheService 
{
    AddItem(...);
}

Sie können eine Implementierung bieten, basierend auf System.Web:

public AspNetBasedCacheService : ICacheService
{
    AddItem(...)
    {
        // Implementation that uses the HttpContext.Cache object
    }
 }

Und dann hat, dass die Umsetzung ‚veröffentlicht‘ als Singleton. Beachten Sie, dass der Unterschied mit Ihrem ursprünglichen Ansatz ist, dass die Singleton ist nur ein Verweis auf die ASP.NET-Cache-Service-basierte Implementierung, anstelle des vollständigen ‚Cache-Objekt‘.

public class ChacheServiceProvider 
{
    public static IChacheService Instance {get; set;}

}

Sie würden die chaching Implementierung initialisieren entweder durch verzögerte Initialisierung durchgeführt wird, oder beim Start der Anwendung (in global.asax.cs)

Und jede Domänenkomponente der Lage wäre, den veröffentlichte Caching Service zu nutzen, ohne zu wissen, dass es basierend auf System.Web umgesetzt wird.

// inside your class library:
IChacheService chache = CacheServiceProvider.Instance;
cache.AddItem(...);

Ich bin damit einverstanden, dass es wahrscheinlich nicht die einfachste Lösung, aber ich bin mit dem Ziel Vorteile der ASP.NET Cache-Implementierung für die Aufnahme ohne Code zu opfern Entkopplung und Flexibilität.

Ich hoffe, ich verstand Ihre Frage richtig.

Andere Tipps

Die Daten würden nicht Müll so lange gesammelt bekommen wie der Cache hält immer noch einen Verweis auf sie.

Auch nicht immer Singletons verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top