So verbessern Sie die Auswahlmethode für Datenzugriffslayer Muster

8

In letzter Zeit schreibe ich Methoden zum Auswählen von Datenzugriffsschichten, wobei der Code all diese allgemeine Form annimmt:

%Vor%

Oder so:

%Vor%

Diese Methoden werden von Business-Layer-Code aufgerufen, der die DataTable- oder DataRecord-Basis in stark typisierte Geschäftsobjekte konvertiert, die von der Präsentationsschicht verwendet werden können.

Da ich wiederholt ähnlichen Code verwende, möchte ich sicherstellen, dass dieser Code der beste Code ist. Wie kann es verbessert werden? Und es lohnt sich zu versuchen, den gemeinsamen Code von diesem auf seine eigene Methode zu übertragen. Wenn ja, wie würde diese Methode aussehen (speziell hinsichtlich der Übergabe einer SqlParameter-Sammlung)?

    
Joel Coehoorn 12.01.2009, 16:39
quelle

7 Antworten

3

Muss meine eigene hinzufügen:
DataReader von DataLayer in Using zurückgeben Aussage

Das neue Muster ermöglicht es mir, immer nur einen Datensatz im Speicher zu haben, aber umschließt die Verbindung immer noch in einer netten using-Anweisung:

%Vor%     
Joel Coehoorn 12.05.2009 18:15
quelle
2

Ein Muster, das mir gefallen hat, sieht für den Client-Code so aus:

%Vor%

Normalerweise mache ich die Verbindung optional, und ich werde so codieren, dass ich sie aus dem ConnectionStrings-Konfigurationsabschnitt herausholen oder sie als die tatsächliche Verbindungszeichenfolge behandeln kann. Dadurch kann ich den dal in einmaligen Szenarien wiederverwenden und bin zum Teil ein Habbit von den COM + -Tagen, als ich die Verbindungszeichenfolge mit der Objektkonstruktionseigenschaft gespeichert habe.

Ich mag das, weil es einfach zu lesen ist und den ganzen ADO-Code von mir verbirgt.

    
JoshBerke 12.01.2009 16:52
quelle
1

Das einzige, was ich anders mache, ist, dass ich von meinen eigenen internen Datenbank-Hilfsmethoden auf den eigentlichen Datenzugriff-Anwendungsblock umschalte Ссылка

Macht es für andere Entwickler, die die Enterprise-Bibliothek kennen, um den Code hochzufahren, etwas standardisierter / einheitlicher.

    
quelle
1

Es gibt so viele Möglichkeiten, den DBAL zu implementieren, meiner Meinung nach sind Sie auf dem richtigen Weg. Etwas, das Sie in Ihrer Implementierung berücksichtigen sollten:

  • Sie verwenden eine Factory-ähnliche Methode, um Ihre SqlConnection zu erstellen, das ist ein kleiner Punkt, aber Sie können dasselbe für Ihren SqlCommand tun.
  • Die Parameterlänge ist optional, Sie können sie also wirklich aus dem Parameter.Add-Aufruf herauslassen.
  • Erstellen Sie auch Methoden zum Hinzufügen von Parametern, Codebeispiel unten.

Fügen Sie Parameter hinzu mit DbUtil.AddParameter(cmd, "@Id", SqlDbType.UniqueIdentifier, Id);

%Vor%     
DavGarcia 12.01.2009 17:13
quelle
1

Zunächst denke ich, dass Sie bereits überlegt haben, ein ORM zu verwenden, anstatt das eigene zu rollen. Ich werde nicht auf diesen eingehen.

Meine Gedanken dazu, einen eigenen Datenzugriffscode zu erstellen:

  • Im Laufe der Zeit fand ich es einfacher, keine separaten DAL / BL-Objekte zu haben, sondern sie zu einem einzigen Objekt zusammenzufassen (einige Zeit später fand ich heraus, dass es ein ziemlich bekanntes Muster ist - nämlich ActiveRecord). Es sieht vielleicht gut aus und entkoppelt, um separate DAL-Baugruppen zu haben, aber der Overhead in den Wartungskosten summiert sich. Jedes Mal, wenn Sie eine neue Funktion hinzufügen, müssen Sie mehr Code erstellen / weitere Klassen modifizieren. Meiner Erfahrung nach ist das Team, das die Anwendung verwaltet, oft viel weniger als das ursprüngliche Entwicklerteam, das es erstellt hat, und sie hassen die zusätzliche Arbeit, die erforderlich ist.
  • Für große Teams könnte es sinnvoll sein, die DAL zu trennen (und eine Gruppe daran arbeiten zu lassen, während die anderen. Aber das ist ein guter Anreiz für Code Bloat.
  • Kommen wir zu Ihrem spezifischen Beispiel: Wie verwenden Sie das resultierende DataTable? Iterieren Sie die Zeilen, erstellen Sie typisierte Objekte und holen Sie sich die Daten aus der Zeile? Wenn die Antwort ja ist, denken Sie an die zusätzliche DataTable, die Sie nur zum Verschieben von Daten zwischen der DAL und der BL erstellt haben. Warum nicht direkt vom DataReader?
  • Auch über das Beispiel: Wenn Sie eine untypisierte DataTable zurückgeben, dann müssen Sie die Spaltennamen (der Ergebnismenge, die der SP-Aufruf zurückgibt) weit oben im aufrufenden Code verwenden. Das bedeutet, wenn ich etwas in der Datenbank ändern muss, kann es beide Ebenen betreffen.

Mein Vorschlag (Ich habe beide Methoden ausprobiert - der Vorschlag ist der neueste Arbeitsansatz, den ich entwickelt habe - er hat sich im Laufe der Zeit entwickelt).

  • Erstellen Sie eine Basisklasse für Ihre typisierten Geschäftsobjekte.
  • Behalte den Objektstatus in der Basisklasse (neu, modifiziert usw.)
  • Legen Sie die Hauptdatenzugriffsmethoden in dieser Klasse als statische Methoden fest. Mit ein wenig Aufwand (Hinweis: generische Methoden + Activator.CreateInstance) können Sie für jede im Reader zurückgegebene Zeile ein Business-Objekt erstellen.
  • Erstellen Sie im Business-Objekt eine abstrakte Methode zum Analysieren der Zeilendaten (direkt aus dem DataReader!) und füllen Sie das Objekt.
  • Erstellen Sie statische Methoden in den abgeleiteten Geschäftsobjekten, die die gespeicherten Prozessparameter vorbereiten (abhängig von verschiedenen Filterkriterien) und rufen Sie die generischen Datenzugriffsmethoden von der Basisklasse auf.

Das Ziel besteht darin, wie folgt zu verwenden:

%Vor%

Der Vorteil für mich war, dass ich nur eine Datei ändern muss, um Änderungen in den Datenbankspaltennamen, -typen usw. zu bewältigen (kleine Änderungen im Allgemeinen). Mit einigen gut durchdachten Regionen können Sie den Code so organisieren, dass es sich um separate "Ebenen" im selben Objekt handelt :). Der andere Vorteil ist, dass die Basisklasse wirklich von einem Projekt zum anderen wiederverwendet werden kann. Und der Code Bloat ist minimal (gut, verglichen mit den Vorteilen. Sie könnten auch Datasets füllen und sie an UI-Steuerelemente binden: D

Die Einschränkungen - Sie haben am Ende eine Klasse pro Domänenobjekt (normalerweise pro Hauptdatenbanktabelle). Und Sie können keine Objekte in vorhandenen Transaktionen laden (obwohl Sie daran denken könnten, die Transaktion weiterzugeben, falls Sie eine haben).

Lassen Sie es mich wissen, wenn Sie an weiteren Details interessiert sind - ich könnte die Antwort ein wenig erweitern.

    
Dan C. 14.01.2009 22:45
quelle
1

Ähnlich wie ich hier

gepostet habe %Vor%

Ich habe diese einfachen Erweiterungsmethoden, um den Aufruf zu vereinfachen:

%Vor%

So kann ich jetzt anrufen:

%Vor%

Dies ist vollständig generisch und passt zu jedem Modell, das den ado.net-Schnittstellen entspricht. Das Verbindungsobjekt und der Leser werden erst nach dem Auflisten der Auflistung angeordnet.

    
nawfal 14.02.2013 08:12
quelle
-1

Die einfachste Lösung:

%Vor%     
Mohsen 10.09.2017 06:21
quelle