Frage

Ich arbeite an einem Projekt mit ASP.NET MVC und Repository-Modell. Ich habe Repository-Klassen und Dienste, die diese Repository-Klassen verbrauchen. Meine Frage ist: Ist es richtig, ein IQueryable aus meiner Repository-Klasse zurückkehrt und dann „.Where“ verwenden und „.OrderBy“ in einem Dienst eine Liste zu generieren? Wenn ja, ist es die beste Praxis?

Danke!

War es hilfreich?

Lösung

Für den Anfang: Es gibt keine „richtige“ oder „falsche“ hier. Es ist nur eine Frage dessen, was am besten für Sie und das System, das Sie bauen. Zum Beispiel hat Rob Conery eine ASP.NET-Beispielanwendung namens Schaufenster mit genau dem Muster Sie beschreiben, und es entzündet, um eine große Flamme Krieg. Ein großer Teil der Diskussion entwickelte sich um das Repository-Muster, das die „Original“ in Betracht gezogen wird, wie durch Eric Evans in seinem Buch Domain Driven Design und dass die Schnittstelle eines Endlager als eine beschrieben, die akzeptiert und / oder gibt tatsächlich Fälle (von Listen von Instanzen) und nicht eine Abfrage-Schnittstelle.

So viel zur Theorie. Was für Ihr System zu wählen? Der Grund, warum ich würde nicht direkt auf die IQueryable Route wählen ist, dass es tatsächlich ein bisschen meiner Persistenz-Strategie auf die Client-Schicht (das ist die Service-Schicht in diesem Fall) austritt. Da es sich in erster Linie sinnvoll, eine IQueryable zurückgeben, wenn Sie Objekte aus der Datenbank sind abzurufen unter Verwendung von LINQ to [einer Datenbank-Zugriffsverfahren (wie SQL, Entities, ...)]. Erst dann wird .wo oder .OrderBy Ihr Abfrageergebnis werden zu optimieren. Es macht natürlich keinen Sinn, wenn Sie einige Datenbankzugangscode Code verwenden, das eine vollständige Liste bekommt, die Sie dann aus dem Repository belichten mit LINQ to Objects. Also kurz gesagt: machen Sie Ihre Client-Schicht in die LINQ-basierte Datenbank-Zugriffsstrategie binden Sie mit

.

ein bisschen eines Puristen Da mich selbst, würde ich es vorziehen, nicht diese Bindung an LINQ an der Oberfläche von aus meinem Repository und ich wählen würde, wo- und Order-by-Kriterien durch die Parameter der Operationen des Endlagers bieten. Ich kann im Repository all Retrieval-Optimierung tun und eine saubere saubere Reihe von Domain-Objekten zurück.

Also am Ende darauf ankommt., Was am besten für Sie ist in Ordnung

Andere Tipps

Ich sehe nicht, warum das wäre ein Thema sein. Wenn Sie vorhaben, spezifischere im Daten werden werden Sie in Ihrem Service-Layer werden abrufen, bedeutet, dass weniger Daten zwischen der Anwendung und der Datenbank übertragen werden - was eine höhere Effizienz bedeutet. so bedeutet Weise werden Sie auch träges Laden, oder sich die Daten implementieren, wenn Sie unbedingt brauchen. In Anbetracht der Staatenlosigkeit der Bahn, das ist eine gute Sache. Sie wollen nicht, um alle Daten sein, falls das Abrufen Sie können verwenden.

Mit anderen Worten, es gibt keinen Sinn, in die gesamte Liste der Benutzer immer, einfach diejenige auswählen, dessen Name ist „Jackolantern.“

Der beste Weg, daran zu denken ist, wie so - wenn Sie morgen von MSSQL zu MySQL wechseln entscheiden, werden Sie Business-Logik replizieren Wenn ja, dann Sie nutzen Repository falsch.

Ja, ich bin ziemlich glücklich mit dem Repository Rückkehr IQueryable, aber mit einer Einschränkung: ein paar Linq-Funktionen sind bei allen Anbietern nicht zur Verfügung. Zum Beispiel sind die Single / SingleOrDefault Methoden nicht verfügbar in Linq to Entities. So Ihre Service-Schicht durch einige Reifen müssen springen kann je nachdem, welche konkreten Umsetzung Ihres Repositorys verwendet wird.

Ich habe in der Regel die Schnittstelle der Repository-Klassen in der Domänenschicht und den tatsächlichen Implementierungen in der Dienstschicht.

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