Werden in ASP.net 5 und EF7 Repositorys mehr benötigt?

9

Ich habe eine Frage zu Github an das EF-Team gesendet. Ich habe eine Antwort erhalten, die besagt, dass es besser ist, diese Frage hier zu stellen, damit ich sie hier kopieren und einfügen kann, da wir als Link die wenigen Antworten auf GitHub sehen können.

Frage: Ich habe einige Nachforschungen angestellt und jemand hat darauf hingewiesen, dass in Zeile 24 der DBContext-Klasse angegeben ist

DbContext ist eine Kombination aus Arbeitseinheits- und Repository-Mustern.

Bedeutet dies, dass wir EF nicht mehr in ein Repository abstrahieren und es dann mit und Interface in Controller einfügen müssen?

Ursprünglicher Beitrag auf Github: https://github.com/aspnet/EntityFramework/issues/4899

Der Grund, warum ich das frage, ist, dass ich an eine Stelle komme, an der ich dem Repository viele Methoden wie GetById, GetByName, GetWithIncludesABC, GetWithIncludes123 usw. hinzufüge, und es scheint das Repo in meinem Kopf zu verschmutzen

Loren.Dorez
quelle
1
Was halten Sie von der Antwort, die Rowanmiller gegeben hat? Scheint mir völlig vernünftig.
Robert Harvey
@ RobertHarvey Ja, es war eine gute Antwort, aber ich möchte sehen, wie andere über das Thema
denken,
Siehe auch lostechies.com/jimmybogard/2009/09/11/wither-the-repository, wo Bogard ähnlich argumentiert.
Mcknz
Meine Meinung dazu, warum EF (und andere ORMs) keine Repositories sind .
Eric King
Ein Repository hätte keine Methode wie GetWithIncludesABC. Das Repository-Muster ist im Grunde eine Abstraktion einer Datenbanktabelle als Sammlung. Normalerweise ist es möglich, die Sammlung abzufragen (z. B. nach LINQ), und das Repository konvertiert die Abfrage dann in SQL. Was Sie sprechen, klingt eher wie ein Daten-Gateway.
Herr Cochese

Antworten:

12

Wenn Sie einem Repository Methoden wie hinzufügen

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Dann ist es besser, zu einer Service-Schicht zu wechseln und die Service-Schicht EF direkt verwenden zu lassen. EF verfügt bereits über ähnliche Funktionen wie die oben genannten Methoden, die Sie nur endlos duplizieren.

Ein Service Layer macht Business Domain-Methoden verfügbar und implementiert sie mithilfe von CRUD . Beispielsweise haben Sie möglicherweise eine Methode namens TransferMoney(A, B), bei der A und B Konten überprüfen. Auf diese Weise können Sie die Sprache Ihrer Geschäftsdomäne sprechen, während die Service-Schicht die CRUD für Sie verwaltet.

Der einzige zwingende Grund, warum ich mir vorstellen kann, wo Sie möglicherweise eine separate Repository-Schicht haben möchten, ist, dass Sie diese Repository-Schicht verspotten oder zu Testzwecken eine andere Datenquelle ersetzen können.

Robert Harvey
quelle
Sie können jedoch dbset verspotten ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot
4

Robert Harvey sagte in seiner Antwort:

Der einzige zwingende Grund, warum ich mir vorstellen kann, wo Sie möglicherweise eine separate Repository-Schicht haben möchten, ist, dass Sie diese Repository-Schicht verspotten oder zu Testzwecken eine andere Datenquelle ersetzen können.

Genau aus diesem Grund ist das Repository-Muster immer noch relevant. Ich bin auch nicht einverstanden mit der Behauptung der Entity Framework-Teams, dass sie das Repository-Muster implementieren. Entity Framework ist immer noch stark an eine Datenbank gebunden. Der gesamte Zweck des Repository-Musters besteht darin, den genauen Persistenzmechanismus, der in Ihrer Anwendung verwendet wird, zu entkoppeln und zu abstrahieren, sodass nichts von der Implementierung des Datenzugriffs außerhalb der Repository-Schicht verloren geht.

Wenn Sie die EF-Abfrage-API außerhalb des "Repositorys" verwenden, wie in einem Serviceobjekt, würde ich sagen, dass Sie das Muster brechen.

Wenn es kein katastrophales Problem für datenbankähnliche Funktionen ist, in Ihren anderen Code zu gelangen, und Sie garantieren können, dass Sie einige Ihrer CRUD-Vorgänge in Zukunft nicht mehr auf einen Webdienst verschieben müssen, ist die direkte Verwendung von EF der Fall IN ORDNUNG.

Grundsätzlich ersetzt Entity Framework das Gateway-Objekt im Repository-Muster. Ich sehe es nicht als Repository selbst.

Greg Burghardt
quelle
Wie unterscheidet sich das Repository von einem Service-Layer-Aspekt? von dem, was ich finden kann, wenn ich IQueryable zurückgebe, dann bin ich im Wesentlichen ein Repository, wenn ich IEnumerable zurückgebe, dann benutze ich eine Serviceschicht. Ist das richtig? Sind Service Layer- und Repository-Muster ähnlich?
Loren.Dorez
@ Loren.Dorez: Ein Service Layer verfügt über Business Domain-spezifische Methoden wie TransferFunds()und BuildWidget(). Ein Repository enthält nur CRUD-Methoden.
Robert Harvey
Also würden dann sowohl ein Service Layer als auch ein Repository direkt auf den DBContext zugreifen? Sie würden also die CRUD in die Repo- und Get-Methoden und andere Methoden in die Service-Schicht einfügen? Verstehe ich das richtig?
Loren.Dorez
Der Service Layer greift möglicherweise direkt auf das Repository zu, falls Sie eines haben, anstatt auf EF.
Robert Harvey
@RobertHarvey Können Sie mir ein Beispiel mit Get Methds oben zeigen? Wie jetzt bin ich ein bisschen verwirrt, sorry.
Loren.Dorez