2013-04-10 5 views
5

Ich habe die Entity Framework und die repository pattern seit einiger Zeit verwendet.Kann das Repository-Muster nur mit Entity Framework verwendet werden?

Ich wurde neulich gebeten, eine Datenschicht ohne Entity Framework zu schreiben, einfach nur alt ADO.NET. Ich habe mich gefragt, was wäre der beste Ansatz dafür? Verwende ich auch ein Repository-Muster für meine CRUD-Operationen mit normalem ADO.NET?

Wenn ich gehe zu Codeplex und Suche nach Repository-Muster dann 99,9% aller Beispielprojekte verwenden Entity Framework. Gibt es ein anderes Muster, das verwendet werden muss, wenn ich ADO.NET mit gespeicherten Prozeduren verwende?

+3

nein, auf keinen Fall. Das Repository-Muster ist ein universelles Muster für den Datenzugriff - es kann jederzeit verwendet werden, wenn Sie auf Daten zugreifen - egal, wie genau Sie auf die Daten zugreifen. –

+1

Tatsächlich besteht der gesamte * Punkt * der Verwendung des Repository-Musters darin, Ihre Anwendung von dem Zugriff auf die Daten zu isolieren. Dass es häufig EF ist, ist entweder ein Beweis dafür, wie nützlich dieser Rahmen ist, oder der Mangel an Alternativen in Dotnetland. – millimoose

Antwort

4

Nein, das Repository-Muster wird weitgehend außerhalb des Entity Framework verwendet und ist eine rundum nützliche Art, den Datenzugriff zu handhaben.

Von MSDN

  • Ihnen die Zugriffslogik Datenlogik oder Web-Service zentralisiert.
  • Es bietet einen Substitutionspunkt für die Komponententests.
  • Es bietet eine flexible Architektur, die angepasst werden kann, wenn das Gesamtdesign der Anwendung entwickelt wird.

http://msdn.microsoft.com/en-us/library/ff649690.aspx

Weitere Vorteile:

  • einfache Logik im Repository hinzuzufügen, wie Caching Ergebnisse über eine Web-Anfrage
  • Gemeinsame Abfrage hinzugefügt werden können, wie userRepository.FindByEmailAddress(emailAddress);
  • Das Repository kann mit einem anderen geändert werden, z. B. das Wechseln einer Datenbank zu einem Webdienst mit minimalem Aufwand
0

Martin Fowler „Patterns of Enterprise Architecture“ stellt die folgende Definition für ein Endlager:

vermittelt zwischen der Domänen- und Datenmapping Schichten einer Sammlung ähnlicher Schnittstelle für Domain-Objekte zugreifen.

Ein gemeinsamer Weg zu implementieren, dass in C# eine allgemeine Repository<T> Klasse zu haben ist, wo T ein persistentes Objekt ist, das IQueryable<T> und bietet zusätzliche Methoden wie Add(entity), Remove(entity) implementiert.

Es wäre sehr schwierig, ohne ein ORM zu implementieren. Sie können ein einfacheres Repository erstellen, das SQL-Anweisungen als WHERE-Bedingungen akzeptiert, aber es kann unordentlich werden.

Zahlreiche Beispiele verwenden konkrete Repository-Klassen für jeden Typ mit unterschiedlichen Persistenzmethoden. Aber das sind nur verkleidete DAO-Klassen.

+2

Ich stimme dir nicht ganz zu. Generics existierten nicht einmal, als er das Muster definierte. Und sie sind zahlreiche Beispiele, die In-Memory-Sammlungen verwenden, um sie zu simulieren. – scartag

+0

Ich habe nur einen allgemeinen Weg zur Implementierung von Repositories zur Verfügung gestellt. Sie können die Implementierung definitiv vereinfachen, um SQL-Anweisungen zu verwenden, um Objekte zurückzugeben und zu materialisieren. –

+0

Generische Repositories sind schlecht mit einer Ausnahme: Alle Ihre Repos sehen gleich aus und bleiben am selben Ort bestehen (z. B. Domain-Repositories, die alles in einer Tabelle in serialisierter Form speichern). Iqueryable von einem Repository ausgesetzt ist ein Anti-Muster aus 2 Gründen: 1) Es setzt voraus, dass ein Business-Objekt identisch ist mit dem zugrunde liegenden Data Store Entity, die meiste Zeit eine ORM-Entität und 2) Iqueryable spezifiziert WIE man eine Abfrage erstellen, wenn das ist Repos Anliegen. Du sagst dem Repository nicht, wie man Sachen macht, du sagst es, was du willst. – MikeSW

2

Ich denke nicht, dass dies der richtige Weg ist. Aber es gibt einige Annahmen

Hinzufügen eines Repository-Muster über EF-Code. Dies hält Sie von den Funktionen Ihres ORMs ab.Das Entity Framework ist bereits eine Abstraktionsschicht über Ihrer Datenbank.

Wenn Sie Dependency Injection und Test Driven Development über EF verwenden möchten, folgen Sie dem Repository-Muster. Durch die Verwendung von RP wird Ihr Code testbar und injizierbar/wartbar.

Out of the Box EF ist nicht sehr überprüfbar, aber es ist ziemlich einfach, eine mockfähige Version des EF-Datenkontexts mit einer Schnittstelle zu erstellen, die injiziert werden kann.

Wenn wir nicht möchten, dass unser Code testbar oder injizierbar ist, dann verwenden Sie einfach nicht RP.

sah ich einen Blog-Post: http://www.nogginbox.co.uk/blog/do-we-need-the-repository-pattern

+1

Aber hast du diesen Beitrag gesehen? http://www.sapiensworks.com/blog/post/2012/10/10/Do-We-Need-The-Repository-Pattern.aspx;) – MikeSW

+0

Ich hatte den Beitrag nicht gesehen. Vielleicht sollte ich einen neuen nogginbox-Blogbeitrag mit dem Titel "Wann sollte ich das Repository-Muster mit einem ORM verwenden" schreiben? Viele gute Gründe in Sapiens Arbeit's Post darüber, warum du es würdest. Wenn Sie nur Ihr ORM umhüllen wollen, um es testbar zu machen, dann nein. Wenn Sie mehrere Datenquellen haben, die Sie ausblenden möchten, oder planen Sie, Ihre Datenschicht später auszutauschen, dann vielleicht ja. –