2009-08-18 12 views
0

Ich baue eine Reihe von CRUD-Bildschirmen für ein Repository. Die Mitgliederobjekte sind groß genug, dass ich nicht viele von ihnen auf einmal in den Speicher laden möchte - wie beim Erzeugen von Suchergebnissen.Repository-Muster: Strategie für Listing-Mitglieder

Da alles, was ich brauche für Suchergebnisse sind ein paar Eigenschaften - zB "Name" und "ID" - könnte nur die zugrunde liegende Datenbank abfragen - aber ich möchte das Repository nicht umgehen, seit dem würde viel von seinem Wert negieren.

Die Intros und Tutorials zum Repository-Muster, die ich gefunden habe, decken dieses Szenario nicht ab. Sie konzentrieren sich auf das Speichern/Abrufen/Löschen eines vollständig bevölkerten Objekts auf einmal.

Ich kenne das Proxy-Muster für Lazy-Loading-Objekte. Aber machen die großen Jungs das so? Gibt es eine gut etablierte Lösung für dieses Problem?

Antwort

1

Wenn Sie strikt nach DDD gehen, denke ich, dass Ihre Suchen vollständig bevölkerte Objekte zurückgeben sollten. Aber manchmal muss man die Regeln verbiegen.

ich kann Ihnen sagen, was nicht zu tun:

  1. Sie abrufen nicht nur die Daten, die Sie benötigen und zurück nach wie vor nicht-voll besiedelten Instanzen der Entity-Klasse. Dies kann leicht zu einer Katastrophe werden. Sie erhalten verschiedene Abfragemethoden, die scheinbar vollständig bevölkerte Entitäten zurückgeben. In Wirklichkeit hängt dies jedoch davon ab, welche Abfragemethode aufgerufen wurde. Erwarte Verwirrung.

  2. Rollen Sie nicht Ihr eigenes faules Initialisierungsschema. Es ist schwierig und fehleranfällig. Ich habe das einmal getan, und ich kann sicher sagen, dass es sich nicht gelohnt hat.

Also, was bleibt? Meine Stimme besteht darin, die benötigten Daten zu erfassen und eine Klasse zu erstellen, die nur die Felder enthält, die Sie füllen möchten, und eine Liste dieser Felder zurückzugeben. Jetzt weiß jeder, der Ihre Suchfunktion aufruft, genau, was er bekommt: eine Teilmenge der tatsächlichen Daten. Wenn Sie die vollständige Entität benötigen, müssen Sie erneut auf die Datenbank zugreifen. Hier

ist ein Beispiel dafür, was ich meine, in Java:

public class CakeRepository { 
    public List<CakeProjection> getCakesByManufacturer(String manufacturer); 

    public Cake getCake(long id); 

    ... 
} 

public class CakeProjection { 
    private long id; 
    private String cakeName; 

    ... 
} 
+0

Ja, ja, ja, alles macht Sinn. Vielen Dank. Jetzt muss ich nur einen Namen für diese partiellen Entitäten finden. "Projektion", nicht wahr? – Metaphile

0

Sie definieren Abfragen auf der Repository-Schnittstelle, die die Daten zurückziehen, nach denen Sie suchen.

Ich denke, die großen Jungs verwenden eine ORM-Schicht (wie Hibernate) und übergeben eine definierte Abfrage an das ORM.

+0

Also, wenn eine Abfrage gibt an, dass ich in Namen und IDs nur daran interessiert bin, kann mein Repository zurückgeben eine Reihe von Objekten mit den meisten ihrer Eigenschaften auf NULL gesetzt? – Metaphile

+0

die akzeptierte Antwort scheint mir gut. – mcintyre321