2008-08-19 2 views
3

Ich habe Projekte gesehen, in denen die Klassen in der DB-Schicht nur statische Funktionen in ihnen und anderen Projekten haben, in denen diese Klassen instanziiert werden müssen, um Zugang zu den Mitgliedsfunktionen zu erhalten.Sollten DB-Layer-Member statische oder Instanzen sein?

Was ist "besser" und warum?

Antwort

0

Es geht nur um den Zweck der DB-Schicht. Wenn Sie eine Instanz für den Zugriff auf die DB-Schicht verwenden, können Sie mehrere Versionen dieser Klasse verwenden. Dies ist wünschenswert, wenn Sie mit der gleichen DB-Schicht beispielsweise auf mehrere Datenbanken zugreifen möchten.

So könnten Sie so etwas wie dieses:

DbController acrhive = new DbController("dev"); 
DbController prod = new DbController("prod"); 

Welche Sie mehrere Instanzen der gleichen Klasse für den Zugriff auf verschiedene Datenbanken verwenden.

Umgekehrt möchten Sie möglicherweise zulassen, dass nur eine Datenbank gleichzeitig in Ihrer Anwendung verwendet werden kann. Wenn Sie dies tun möchten, können Sie sich eine statische Klasse zu diesem Zweck ansehen.

-2

Es hängt davon ab, welches Modell Sie abonnieren. ORM (objektrelationales Modell) oder Schnittstellenmodell. ORM ist sehr beliebt wegen Frameworks wie Nhibernate, LINQ to SQL, Entity Framework und vielen anderen. Mit dem ORM können Sie einige Geschäftsbeschränkungen für Ihr Objektmodell anpassen und ohne Wissen darüber, wie es an die Datenbank übergeben werden soll, weitergeben. Alles, was mit Einfügen, Aktualisieren und Löschen zu tun hat, geschieht im Objekt und muss den Entwickler nicht wirklich zu sehr beunruhigen.

Die Interface-Modell wie das Enterprise Data Pattern populär gemacht von Microsoft, müssen Sie wissen, in welchem ​​Zustand sich Ihr Objekt in und wie sie behandelt werden sollten. Sie müssen außerdem das erforderliche SQL zum Ausführen der Aktionen erstellen.

Ich würde sagen, mit ORM gehen.

2

Ich mag ein einzelnes Objekt mit einem einzelnen Datensatz in der Datenbank korreliert werden, d. H. Ein Objekt muss instanziiert werden. Dies ist Ihr grundlegendes ActiveRecord Muster. Meiner Erfahrung nach erzeugt der Ein-Objekt-zu-eine-Zeile-Ansatz eine viel flüssigere und linguistischere Darstellung im Code. Außerdem behandle ich gerne Objekte als Datensätze und die Klasse als Tabelle. Zum Beispiel den Namen eines Datensatzes zu ändern tun I:

objPerson = new Person(id) 

objPerson.name = "George" 

objPerson.save() 

während alle Leute zu bekommen, die in Louisiana leben I

aryPeople = Person::getPeopleFromState("LA") 

Es gibt viele Kritikpunkte von Active Record tun könnte. Sie können insbesondere auf Probleme stoßen, bei denen Sie die Datenbank für jeden Datensatz abfragen, oder Ihre Klassen sind eng mit Ihrer Datenbank verbunden, was zu Inflexibilität in beiden führt. In diesem Fall können Sie eine Ebene höher gehen und mit etwas wie DataMapper gehen.

Viele der modernen Frameworks und ORM's bewusst sind einige dieser Nachteile und bieten Lösungen für sie. Machen Sie ein wenig Nachforschungen und Sie werden sehen, dass dies ein Problem ist, das eine Reihe von Lösungen hat und alles hängt von Ihren Bedürfnissen ab.

0

Wie Lomaxx erwähnt, dreht sich alles um den Zweck des DB-Modells.

Ich finde es am besten, statische Klassen zu verwenden, da ich normalerweise nur eine Instanz meiner DAL-Klassen erstellen möchte.Ich würde lieber statische Methoden verwenden, als mit dem Aufwand zu arbeiten, potentiell mehrere Instanzen meiner DAL-Klassen zu erstellen, in denen nur 1 existieren sollte, die mehrfach abgefragt werden können.

0

Ich würde sagen, es hängt davon ab, was man die „DB-Schicht“ tun will ...

Wenn Sie allgemeine Routinen für eine gespeicherte Prozedur ausgeführt wird, oder SQL-Anweisung, die einen Dataset zurück, dann mit statische Methoden wären für mich sinnvoller, da Sie keinen permanenten Verweis auf ein Objekt benötigen, das den Datensatz für Sie erstellt hat.

Ich würde auch eine statische Methode verwenden, wenn ich einen DB-Layer erstellen würde, der als Ergebnis eine stark typisierte Klasse oder Sammlung zurückgibt.

Wenn Sie auf der anderen Seite eine Instanz einer Klasse erstellen möchten, indem Sie einen gegebenen Parameter wie eine ID verwenden (siehe @ barret-conrads Antwort), um eine Verbindung zur Datenbank herzustellen und den erforderlichen Datensatz zu erhalten wahrscheinlich nicht eine statische Methode für die Klasse verwenden möchten. Aber selbst dann würde ich sagen, dass Sie wahrscheinlich eine Art von DB Helper-Klasse haben würden, die statische Methoden hätte, auf die Ihre andere Klasse angewiesen war.

0

Noch ein "es kommt darauf an". Ich kann mir aber auch ein sehr häufiges Szenario vorstellen, in dem statische Daten einfach nicht funktionieren. Wenn Sie eine Website haben, die eine ordentliche Menge an Datenverkehr erhält und eine statische Datenbankschicht mit einer gemeinsamen Verbindung aufweist, könnte dies zu Problemen führen. In ASP.Net gibt es eine Instanz Ihrer Anwendung standardmäßig erstellt, und wenn Sie eine statische Datenbank-Ebene haben, können Sie nur eine Verbindung zur Datenbank für alle wer Ihre Website verwendet.

Verwandte Themen