Welche Vor- / Nachteile hat die Auswahl zwischen statischen und Instanz-Datenzugriffsklassen in einer Web-App?

8

Ich habe einige andere Fragen zu diesem Thema gelesen ( hier hier und < a href="https://stackoverflow.com/questions/731763/should-c-methods-that-can-be-static-be-static"> hier ), aber haben noch eine große Antwort zu sehen . Ich habe meinen fairen Anteil an Datenzugriffsschichten schon früher entwickelt und bevorzuge es, anstelle von statischen Klassen Instanzklassen zu verwenden. Es ist jedoch eher eine persönliche Präferenz (ich teste gerne meine Geschäftsobjekte, und dieser Ansatz macht es einfacher, die DAL zu verspotten). Ich habe zuvor statische Klassen verwendet, um auf die Datenbank zuzugreifen, aber ich fühlte mich immer etwas unsicher in der Angemessenheit eines solchen Entwurfs (besonders in einer ASP.NET-Umgebung).

Kann jemand in Bezug auf diese beiden Ansätze zur Entwicklung von Datenzugriffsklassen mit ADO.NET-Providern (kein ORM), insbesondere in einer ASP.NET-Anwendung, einige gute Vor- und Nachteile bieten? Fühlen Sie sich frei zu schlagen, wenn Sie mehr allgemeine statische vs. Instance-Klassen-Tipps als auch haben.

Insbesondere geht es mir um folgende Punkte:

  1. Threading & amp; Nebenläufigkeit
  2. Skalierbarkeit
  3. Leistung
  4. Alle anderen Unbekannten

Danke!

    
Kevin Babcock 20.01.2010, 01:07
quelle

4 Antworten

10

Statisch basierte Ansätze haben in der Regel nur einen Hauptvorteil: Sie sind einfach zu implementieren.

Instanzbasierte Ansätze gewinnen für:

  1. Threading und Parallelität - Sie benötigen keine / so viel Synchronisation, so dass Sie einen besseren Durchsatz erhalten
  2. Skalierbarkeit - Gleiche Probleme wie oben
  3. Perf. - Gleiche Probleme wie oben
  4. Testbarkeit - Dies ist viel einfacher zu testen, da das Ausspionieren einer Instanz einfach ist und das Testen von statischen Klassen mühsam ist

Statische Ansätze können gewinnen:

  1. Speicher - Sie haben nur eine Instanz, also weniger Fußabdruck
  2. Konsistenz / Freigabe - Es ist einfach, eine einzelne Instanz mit sich selbst konsistent zu halten.

Im Allgemeinen finde ich, dass instanzbasierte Ansätze überlegen sind. Dies wird umso wichtiger, wenn Sie auch über einen einzelnen Server hinaus skalieren, da der statische Ansatz "zerbricht", sobald Sie ihn auf mehreren Rechnern instanziieren ...

    
Reed Copsey 20.01.2010, 01:13
quelle
5

Mein allgemeines Gefühl ist: Warum instanziieren, wenn Sie nicht müssen?

Ich verwende statische Klassen, wenn mehrere Instanzen nicht verwendet werden und keine Instanzmitglieder benötigt werden. Was die DAL betrifft, ist der Punkt, dass es nur einen gibt. Warum es instanziieren, wenn es keinen Wert darin gibt?

Sehen Sie sich diesen Link an, der zeigt, dass statische Methodenaufrufe schneller sind als die Instanzklassenmethode Anrufe.

Dieser Link zeigt, dass ein Vorteil der Verwendung einer statischen Klasse ist dass der Compiler überprüfen kann, dass keine Instanzmitglieder versehentlich hinzugefügt wurden.

Dieser Link zeigt, dass eine statische Klasse als praktischer Container für Mengen von verwendet werden kann Methoden, die nur mit Eingabeparametern arbeiten und keine internen Instanzfelder abrufen oder setzen müssen. Für eine DAL ist dies genau das, was Sie haben. Es gibt keinen Grund, interne Instanzfelder zu erstellen und daher keinen Grund für die Instanziierung.

    
Gabriel McAdams 20.01.2010 01:10
quelle
0

Ich verwende seit Jahren eine statische DAL und stimme Ihren Bedenken zu. Threading und Parallelität ist die größte Herausforderung und in meinem Fall speichere ich verschiedene Verbindungsobjekte in statischen Thread-Strukturen. Es hat sich als sehr skalierbar und leistungsfähig erwiesen, umso mehr, als ich jetzt PropertyInfo in PropertyDescriptor umwandle, was mir die gleichen Vorteile von Reflektion mit besserer Leistung bringt. In meiner DAL muss ich einfach schreiben:

%Vor%

Alles erzeugt die statische SQL-Klasse, und das macht meinen Code viel einfacher.

    
Otávio Décio 20.01.2010 01:15
quelle
0

Für mich ist der Hauptgrund, dass ich den Zustand dieses DAL-Objekts nicht behalten muss. Der Status der Objekte, die es verwendet, umfasst nicht den Bereich der Methode, die sie eingebettet sind. Auf diese Weise, warum würden Sie mehrere Instanzen eines Objekts behalten, wenn sie alle gleich sind?

Mit den neuesten Versionen von ADO.NET scheint es die beste Vorgehensweise zu sein, die Verbindung zur Datenbank im Rahmen Ihres Aufrufs zu erstellen und zu zerstören, und der ConnectionPool kümmert sich ohnehin um das Problem der Wiederverwendbarkeit der Verbindung.

Auch mit den neuesten Versionen von .NET Framework, TransactionScope (was ein Grund wäre, Ihre Verbindungen selbst zu verwalten), gelangen Sie auf die Geschäftsebene, auf der Sie mehrere Aufrufe an die DAL innerhalb desselben Scope verbinden können.

Ich kann also keinen konkurrierenden Fall sehen, Instanzen des DAL zu erstellen und zu zerstören (oder zwischenzuspeichern).

    
Wagner Silveira 20.01.2010 01:55
quelle