Empfohlenes Muster für Lazy-Loading Teile des Objektdiagramms aus dem Cache

8

Ich verwende Memcache hinter einer Web-App, um die Zugriffe auf unsere SQL-Datenbank zu minimieren. Ich speichere C # -Objekte in diesen Cache, indem ich sie mit SerializableAttribute ankreuze. Wir verwenden die Abhängigkeitsinjektion über Ninject in unserer App.

Einige dieser Objekte sind groß, und ich möchte sie aufteilen. Sie stammen jedoch aus einem einzigen gespeicherten Prozeduraufruf (dh ein Aufruf einer gespeicherten Prozedur wird in das vollständige Objektdiagramm eingekocht), und ich würde gerne in der Lage sein, diese Objekte aufzulösen und bestimmte Teilgraphen getrennt aus dem Cache zu laden Laden Sie das gesamte Objektdiagramm gleichzeitig in den Speicher.

Welche Muster helfen mir dabei?

    
FMM 08.02.2012, 20:02
quelle

2 Antworten

4

Was die Muster betrifft, würde ich sagen, dass das eine große komplexe Objekt, das aus einer einzigen gespeicherten Prozedur besteht, verdächtig ist. Ich bin mir nicht sicher, ob das Caching eine Voraussetzung oder nur der aktuelle Stand der Implementierung ist.

Das Muster, an das ich mich gewöhnt habe, ist eine Art Repository-Muster, das Operationen verwendet, die bestimmte Verträge füllen. Und diese Operationen enthalten eine oder mehrere Datenquellen, die gespeicherte Prozeduren in der Datenbank aufrufen, die verwendet werden, um EINE dieser Untergraphen zu erstellen, von der Sie sprechen. Wenn Sie Daten aus einer Datenbank laden möchten, kann ich nur davon ausgehen, dass viele der Objekt-Member nicht viel Zeit in Anspruch nehmen, was meinen Punkt weiterbringt - das Objekt zu brechen.

Ein paar Dinge darüber:

  • Es kann gesprächig sein, wenn das gesamte Objekt regelmäßig verwendet wird
  • Es ist vollständig injizierbar über die Operationen
  • Die Datenquellen enthalten den Reader für das spezifische Objekt und führen daher nur eine Aufgabe (SOLID)
  • aus
  • Kann geändert werden, um Entity Framework ohne zu viel Aufwand zu verwenden
  • Kann entwickelt werden, um eine Schnittstelle zu implementieren, die wiederverwendbar ist
  • Erfordert, dass Sie diesen Prozess in kleinere, kaubare Stücke aufteilen, was wahrscheinlich nur auf lange Sicht von Vorteil sein wird.
  • Das komplexe Objekt in diesem Diagramm sollte wirklich nicht existieren, wenn nur Teile davon verwendet werden. Erwägen Sie stattdessen, diese Objekte zu trennen. Es hängt jedoch wirklich davon ab, wie dieses Objekt verwendet wird.

UPDATE:

Wenn ich Ihren Cache als Repository verwende, würde ich wahrscheinlich so vorgehen:

Sie speichern das veraltete Objekt also grundsätzlich, aber in Ihren Vorgängen verwenden Sie sie, um mehr relevante DTOs zu erstellen, die an den Client zurückgegeben werden.

    
Sinaesthetic 21.03.2013, 16:43
quelle
2

Ich weiß, dass NHibernate Lazy Loading kauft, um Objekte durch Proxy-Objekte zu ersetzen. Dann gibt es im Proxy-Objekt eine Art von Überprüfung, die das Laden des realen Objekts verursacht, wenn Sie das erste Mal versuchen, auf das Objekt zuzugreifen.

Ich bin mir nicht sicher, welche Design Patterns das abdecken würden, aber Sie können sich den Nhibernate-Quellcode ansehen.

Ein Nachteil bei der Verwendung von Proxy-Objekten ist, dass Sie bei Vererbung und Typ-Checks vorsichtig sein müssen, da Sie den Typ des Proxys und nicht das tatsächliche Objekt überprüfen könnten.

    
eaglestorm 26.03.2013 02:42
quelle

Tags und Links