Frage

Hier kann sagen, dass ich ein Domain-Modell mit einer Klasse namens Blog habe, das eine Eigenschaft namens BlogEntries (enthält Objekte vom Typ Blogeintrag). Wenn ich ein Datenbankmodell mit zwei Tabellen „Blog“ und „Blogeintrag geschrieben“ habe, ist es nicht unmöglich, dass ich 1000 Blog-Einträge für einen Blog. Wenn ich den Blog auf einer Website zeigen, würde ich möchte nur vielleicht 20 Blog-Einträge zu einem Zeitpunkt angezeigt werden, so würde ich muß irgendeine Art von Paging verwenden. Ich offensichtlich nicht wollen, 1000 Datensätze aus der DB die ganze Zeit abgerufen werden.

Wie würde ich mich über das zu tun? Sollte die BlogEntries Eigenschaft auch im Blog Domain-Objekt sein, oder vielleicht in der respository? Ich mag immer noch die Möglichkeit hat, Blog-Einträge sowie geting ein ausgelagerten Ergebnis bestehender hinzuzufügen. Was wäre das NHibernate-Mapping aussehen?

Das Blog / Blogeintrag Sache ist nur ein Beispiel, es könnte nur ein Kunde / Auftrag Beispiel hat auch gewesen oder anderes Master / Detail-Szenario.

Bitte erleuchte mich!

War es hilfreich?

Lösung

Ich würde Blogeintrag macht es eigene Aggregate Wurzel, mit einem eigenen Repository. Sie würden Blogeintrag Instanzen für einen bestimmten Blog erhalten, indem den Blogeintrag Repository für alle Blogeintrag geschrieben: der Abfrage, die einen bestimmten blogid hat. Ich kann keine Einzelheiten über das Repository darüber hinaus, da es mehrere verschiedene Strategien für die Umsetzung Repositories (eine generische Repository vs viele getrennte Suchmethoden gegen eine, die eine komplexe Spezifikation Aufgabe übernimmt, usw.). Die Suchmethode des Repository sollte Paging unterstützen.

public class Blog
{
    public int ID {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> FindByBlogID(
        int blogID, int pageIndex, int pageSize) 
    {
        // implementation
    }
}

Alternativ kann (auch mit Blogeintrag als Aggregat Wurzel modelliert) Sie eine Sammlung von BlogEntryIDs zu Ihrem Blog Klasse hinzufügen könnte. Dies wäre besser als den Blogeintrag Instanzen mich in der Blog-Klasse, wie Sie viel weniger Daten haben würden zu laden, wenn Sie eine Blog-Instanz erhalten mögen. Mit diesem IDs, können Sie eine Teilmenge von ihnen auswählen und in einen Blogeintrag Repository-Methode übergeben, die eine Sammlung von IDs akzeptiert. Mit anderen Worten würde ein wenig mehr Logik in Ihrer Domäne sein, den Paging zu unterstützen, und ein allgemeinere Getter im Repository.

public class Blog
{
    public int ID {get;set;}
    public IEnumerable<int> BlogEntryIDs {get;set;}
    // other stuff
}

public class BlogEntry
{
    public int ID {get;set;}
    public int BlogID {get;set;}
}

public class BlogEntryRepository
{
    public IEnumerable<BlogEntry> Get(IEnumerable<int> blogEntryIDs) 
    {
        // implementation
    }
}

Verwendung für diesen Ansatz wäre wie

// get the second page
var entries = 
  blogEntryRepo.Get(blog.BlogEntryIDs).Skip(1 * PAGE_SIZE).Take(PAGE_SIZE);

In der Datenbank würden Sie mehrere Zeilen zurückgeben, einen für jeden Blog-Eintrag. (I auch mehrere Ergebnis zurückzukehren bevorzugen setzt alle Zeilen aus allen verknüpften Tabellen in einer Datenbank Rundfahrt zu bekommen. Ich habe auch die Verwendung von SQL 2005 die ROW_VERSION Funktion machen Datenbank Paging zu ermöglichen.)

Ich ziehe es im Allgemeinen die zweite Methode, es sei denn, die typische Verwendung unerschwinglich Mengen (zum Beispiel mehr als ein paar tausend) Blogeintrag Instanzen zeigt mit einem Blog verbunden. Ein Array von zu vielen int ist würde mich über Leistung und Speicher machen vorsichtig.

Andere Tipps

Sie müssen den Blogeintrag zugreifen in einem eigenen Repository einen ausgelagerten Liste zu erhalten.

Edit: Warum downvote? Ist das falsch?

Sammlung von Blog-Einträge könnten Sie verwenden Batchsize Attribut. Es wird Ihnen nicht die ganze Sammlung aus der Datenbank auswählen, nur die erforderlichen Werte.

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