7

Ich baue ASP.NET MVC 5 Anwendung.Wie wird Repository und Arbeitseinheitsmuster mit ADO.NET verwendet?

Ich habe über Repository und Unit of Work (UoW) Muster here gelesen.

Diese Beispiele verwenden Entity Framework, das selbst eine hohe Abstraktionsebene hinzufügt.

Ich verwende ADO.NET und nicht EF. Ich möchte wissen:

  1. Ob Repository und UoW-Muster macht Sinn mit ADO.NET?
  2. Wie werden meine Repositories und UoW mit ADO.NET aussehen? Irgendwelche Proben?
  3. Kann ich eine separate Klassenbibliothek für das Repository hinzufügen oder sie zu einem Teil von DAL machen?

Antwort

5

Ich habe eine blog post geschrieben, die Ihnen beibringt, wie man treiberunabhängigen Code schreibt und Uow/Repository-Muster mit reinem ADO.NET implementiert.

Es ist ein bisschen zu lang, um in diese Antwort aufzunehmen, aber im Grunde wird die IDbtransaction Ihre Unit of Work darstellen (oder in einem enthalten sein) und jedes Repository wird die Transaktion oder UoW ​​in seinem Konstruktor nehmen.

Um einen Befehl mit einem IDbTransaction

using (var cmd = transaction.Connection.CreateCommand()) 
{ 
    cmd.Transaction = transaction; 

    //do a CRUD operation here. 
} 
+1

Vielen Dank für das Beispiel, aber wie würden Sie einen DI-Container (ninject zum Beispiel) für die Repositories verwenden, und für die Fabrik auch in einem WebApi/MVC-Projekt? da die Repos ihre Instanz instanziieren müssen – eddy

+0

'yourContainer.RegisterService (container => container.Resolve (). BeginTransaction());' – jgauffin

+0

@jgainffin Ich lese [diesen Beitrag von dir] (http : //blog.gauffin.org/2014/01/unit-of-work-sample-implementation-for-ado-net/) Und ich habe ein paar Fragen: 1) Gibt es irgendwelche Leistungseinbußen für die Erstellung einer Transaktion sogar wenn Sie nur Daten lesen (auswählen)? 2) Was sind die Implementierungsdetails von IUnitOfWork? Können Sie uns den Code dafür zeigen? Vielen Dank. – Axel

1
  1. Die Einheit des Arbeitsmuster ist wichtiger, wenn Sie über Standard ADO.NET reden, weil man unbedingt darauf achten müssen, dass die Anschlüsse Sie Öffnung für die erforderliche Zeit nur offen sind, erreicht durch Umwickeln von Verbindungen innerhalb using Anweisungen.
  2. Arbeitseinheit in ADO.NET würde wie folgt aussehen:

using (SqlConnection con = new SqlConnection(//connection string) { using (SqlCommand cmd = new SqlCommand(storedProcname, con)) { //... } }

Wie Sie using Aussagen verwenden Ihre Arbeitseinheit zu umfassen, können Sie sicher sein, dass SqlConnection.Dispose() unter der Haube ruft die SqlConnection.Close()-Methode auf, und SqlCommand.Dispose() ruft SqlCommand.Close() auf.

  1. Wie in Ihrer vorherigen Frage beantwortet, können Sie diese beiden trennen, wenn Sie dies wünschen, aber persönlich denke ich, dass sie das gleiche sein sollten.
1

Wenn Sie die definitions der Muster sehen, und die Muster benötigt, um sie zu unterstützen, werden Sie sehen, dass, wenn Sie sie selbst zu implementieren beginnen, werden Sie nie weit sein wandert von Ihrem eigenen ORM zu schaffen . Dies ist zwar eine faszinierende Aufgabe, aber es lohnt sich nie, wenn Sie NHibernate und EntityFramework in Betracht ziehen.

Um jedoch Ihre Frage zu beantworten, fand ich Fowlers PoEAA Buch von unschätzbarem Wert beim Erlernen meiner eigenen UoW, DataMapper und Repositories, die alle auf ADO.Net basieren. Es wurde von jemandem geschrieben, der es offensichtlich wirklich gemacht hat, alle Fehler gemacht und sie dann dokumentiert hat, so dass Sie es nicht müssen. Ich habe den Artikel, den Sie verlinkt haben, nicht gelesen, aber ich bin oft skeptisch, Artikel wie diesen zu verwenden, da sie nur eine oberflächliche Betrachtung solcher Muster demonstrieren.

1

einiger Zeit schrieb ich vor ein blog post zu erstellen, warum das sehr Tutorial Sie verknüpft haben schädlich ist. tldr; Ein Repository verwendet ein DAO, das UoW implementiert, aber das Repository sollte nicht Teil eines UoW sein. Es sei denn, Sie möchten Ihre Code-Basis/Ihr Leben komplizieren.

Ihre Fragen zu beantworten:

  1. Sobald Sie EF oder andere ORM verwenden, wird UOW automatisch dort umgesetzt. Wenn Sie den Micro-ORM-Pfad verwenden (es gibt keinen triftigen Grund, direkt mit ado.net zu arbeiten), ist die UoW im Grunde die db-Transaktion. Ein Repository sollte immer mit Anwendungsobjekten arbeiten, nie mit ORM (Persistenz) -Objekten. Wenn Ihre App-Objekte als Persistenzeinheiten verwendet werden, haben Sie wahrscheinlich eine Standard-CRUD-App, und Sie benötigen das Repository-Muster nicht wirklich. Verwenden Sie für einfache Apps das ORM direkt (es spart viel Zeit).
  2. Ein Repository verwendet ein DAO, das UoW als Implementierungsdetail implementiert. Der Rest der App kennt nichts außerhalb des Repositorys (Schnittstelle) selbst.
  3. Eine Repository-Schnittstelle wird dort definiert, wo sie verwendet wird (normalerweise die Domäne/Business-Schicht). Das Repository Implementierung ist Teil des DAL. Beachten Sie, dass Sie die Repositories nur verwenden sollten, um das Modell zu ändern (Erstellen/Aktualisieren/Löschen). Bei Abfragen ist es viel einfacher und wartungsfreundlicher, query services (objects) mit bestimmten Anwendungsfällen umzugehen, die direkt mit der Datenbank arbeiten.

Es gibt ein eine Menge von dem Repository-Muster zu mißbrauchen gibt, schlage ich vor, das Lese meine "Repository for dummies" Post zu verstehen, das ist ein sehr einfaches Muster, das nichts mit den komplizierten Beispielen zu tun hat, sind Sie in der Regel zu sehen.

+0

Ich mochte Ihren Blog-Post in der Art, wie Sie ihn aus der Perspektive der Business- oder Domain-Ebene erklärten, aber eine Sache hat mich verwirrt. Wenn Sie sagten: "Deshalb befinden sich alle Repository-Schnittstellen in der Business-Schicht, während ihre konkrete Implementierung Teil des Persistence Layers (DAL) ist." Haben Sie im selben Projekt oder in verschiedenen Projekten über Business und DAL gesprochen? Wenn verschiedene Projekte dann nicht eine zirkuläre Referenz schaffen? da die konkreten Implementierungen in der DAL-Schicht auf die Business-Schicht für die Schnittstellen verweisen müssen. – user20358

+0

... und die Business-Schicht muss für die konkreten Implementierungen der Schnittstellen auf die DAL-Schicht verweisen. – user20358

+0

@ user20358 Es spielt keine Rolle. Die "Ebene" ist nur ein logischer Kontext. Der Punkt ist die Repo-Implementierung sitzt in einem anderen Kontext als die Domäne, im Grunde Teil der Infrastruktur. – MikeSW

Verwandte Themen