Was ist die empfohlene Methode, Ad-hoc-Daten (von Fall zu Fall) aus dem Repository zurückzugeben, die nicht in Modell-Entitäten passen oder welche erweitern?Ad-hoc-Daten und Repository-Muster
Das 101-Beispiel wäre die allgegenwärtige Hallo-Wort-Anwendung: ein Blog-System. Angenommen, Sie möchten eine Liste von Posts laden, bei denen der Post-Eintrag einige zusätzliche Informationen enthält, die in der Post-Entität nicht vorhanden sind. Nehmen wir an, es ist die Anzahl der Kommentare und das Datum und die Uhrzeit des letzten Kommentars. Dies wäre sehr trivial, wenn man das einfache alte SQL verwendet und Daten direkt aus der Datenbank liest. Wie soll ich es optimal mit dem Repository-Muster tun, wenn ich es mir nicht leisten kann, die gesamte Sammlung von Kommentaren für jeden Beitrag zu laden, und ich möchte es in einem Datenbank-Treffer tun? Gibt es ein gebräuchliches Muster für diese Situation? Stellen Sie sich nun vor, dass Sie eine relativ komplexe Webanwendung haben, bei der jede Seite ein wenig andere benutzerdefinierte Daten benötigt und das Laden vollständiger Hierarchien nicht möglich ist (Leistung, Speicheranforderungen usw.).
Einige zufällige Ideen:
für jedes Modell eine Liste der Eigenschaften hinzufügen, die von den benutzerdefinierten Daten gefüllt werden könnten.
Untergeordnete Modell-Entitäten von Fall zu Fall und benutzerdefinierte Leser für jede Unterklasse erstellen.
Verwenden Sie LINQ, erstellen Sie Ad-hoc-Abfragen und lesen Sie anonyme Klassen.
Anmerkung: Ich habe eine similar question recently gefragt, aber es schien zu allgemein zu sein und die Besucher nicht viel Aufmerksamkeit.
Beispiel:
Basierend auf Anregungen in Antworten unten, ich bin ein konkreteres Beispiel hinzufügen. Hier ist die Situation war ich versucht, zu beschreiben:
IEnumarable<Post> posts = repository.GetPostsByPage(1);
foreach (Post post in posts)
{
// snip: push post title, content, etc. to view
// determine the post count and latest comment date
int commentCount = post.Comments.Count();
DateTime newestCommentDate = post.Comments.Max(c => c.Date);
// snip: push the count and date to view
}
Wenn ich tun nichts extra und verwenden eine aus dem Regal ORM, dies zu n + 1 Abfragen führen wird oder möglicherweise eine Abfrage Laden alle Beiträge und Kommentare . Aber am besten möchte ich in der Lage sein, nur eine SQL auszuführen, die eine Zeile für jeden Beitrag einschließlich des Posttitels, des Körpers usw. und der Anzahl der Kommentare und des letzten Kommentardatums in demselben zurückgibt. Dies ist in SQL trivial. Das Problem ist, dass mein Repository diese Art von Daten nicht in das Modell einlesen und anpassen kann. Wohin gehen die maximalen Daten und die Anzahl?
Ich frage nicht, wie das geht. Sie können es immer tun irgendwie: fügen Sie zusätzliche Methoden zum Repository hinzu, fügen Sie neue Klassen, spezielle Entitäten, verwenden Sie LINQ usw., aber ich denke, meine Frage ist die folgende. Wie kommt es, dass das Repository-Muster und die richtige modellgetriebene Entwicklung so weit akzeptiert sind, aber sie scheinen diesen scheinbar sehr häufigen und grundlegenden Fall nicht zu behandeln.
Danke, dass Sie mich darauf hingewiesen haben. Ich habe ein einfaches konkretes Beispiel und mehr Erklärung hinzugefügt. –