Ist es unter Verwendung des Repository-Musters richtig, eine IQueryable eines Datensatzes (einer Tabelle) für die allgemeine Verwendung zurückzugeben?
Dies ist in vielen Fällen sehr praktisch, insbesondere wenn externe Bibliotheken verwendet werden, die diese Schnittstelle nutzen, z. B. einige Plugins, die UI-Elemente sortieren / filtern und an sie binden.
Das Offenlegen eines IQueryable scheint das Design jedoch manchmal fehleranfällig zu machen. Dies kann in Verbindung mit einer falschen Verwendung von Lazy Loading zu schwerwiegenden Leistungseinbußen führen.
Auf der anderen Seite scheint es überflüssig zu sein, Zugriffsmethoden für jede einzelne Verwendung zu haben, und es ist auch viel Arbeit (unter Berücksichtigung von Komponententests usw.).
quelle
new DbContext()
wannSaveChanges()
immer sie wollen, und rufen an, wann immer sie wollen. Es ist nicht möglich, etwas zu testen, und ich kann mir nur vorstellen, dass eine zusätzliche Ebene es versteckt.Antworten:
Mark Seemann hat einen ausgezeichneten Blog-Beitrag zu diesem Thema: IQueryable is Tight Coupling . Er fasst es im letzten Teil gut zusammen (Hervorhebung von mir):
ORMs wie Entity Framework sind Implementierungen des Repository und des Unit of Work-Musters. Es ist nicht nötig, sie in eine andere zu wickeln.
quelle
new DbContext()
in MVC keine Controller- und komplexe Logik in einer einzigen Methode einfügen und dann auch keine Logik in die Ansichten einfügen? Ich habe Legacy-Code, in dem ich keine Unit-Tests durchführen kann. Um das Testen zu ermöglichen und zu verhindern, dass Leute wirklich schlechten Code machen, benötige ich eine zusätzliche Ebene. Daher muss ich meine eigenen Repositories für Bildungszwecke implementieren.In diesem Punkt wird es keinen Konsens geben. Meiner Meinung und Erfahrung nach sollte ein Repository Objekte mit bestimmten Verwendungszwecken zurückgeben. Zumindest, wenn Sie das von Eric Evens in DDD definierte Repository-Muster verwenden. Ein Repository ist eine "Brücke" zwischen Geschäftslogik, Persistenz und Fabriken.
Wenn Sie direkter auf die Persistenz zugreifen möchten, suchen Sie möglicherweise nach dem Gateway-Muster.
Nach dem, was Sie hier sagen, möchten Sie diese Exposition gegenüber der Persistenz jedoch verbergen, damit das Proxy-Muster für Sie nützlich sein kann.
quelle