Was sind einige Beispiele für gute Klassenstrukturen, die zum Verwalten des Datenbankzugriffs verwendet werden? Ich bin ein Fan der Klassenkapselung und würde es vorziehen, wenn die Container (z. B. das Auto) keine Datenbankaufgaben ausführen.
Ich möchte auch die Möglichkeit haben, in Zukunft problemlos Dinge wie einen Datenbank-Cache abzulegen.
Ich nehme oft das Muster von Containerklassen, einschließlich Getter und Setter für die Validierung und den Datenbankzugriff, die von einer einzelnen Singleton-Klasse ausgeführt werden. Davon abgesehen wird dies oft zwischen den beiden gemischt und wird ziemlich verwirrend.
Entschuldigung, wenn meine Frage schwer zu verstehen ist; Bei den Datenbanken bin ich mir nicht ganz sicher. Bitte fragen Sie bei Bedarf nach einer Klärung.
Antworten:
Ich bevorzuge das Repository-Muster , um den Datenzugriff zu kapseln. Kurz gesagt, das Repository ist dafür verantwortlich, alle für ein bestimmtes Objekt erforderlichen Daten zu laden. Angenommen, Sie haben ein Autoobjekt, wie in Ihrem Beispiel. Alle Attribute für Auto, Marke, Modell, Jahr, Besitzer, Funktionen (CD-Player, Allrad usw.) werden jedoch in verschiedenen Tabellen in der gesamten Datenbank gespeichert. Das Repository bestimmt, wie die Daten geladen und gespeichert werden. Wenn mehrere kleinere Abfragen erforderlich sind, ist dies in Ordnung, aber nur das Repository-Muster muss dies wissen. Die Service-Schicht, die das Repository aufruft, muss nur wissen, welches Repository aufgerufen werden soll.
Das kann dann mit der Arbeitseinheit kombiniert werden . In Ihrem Beispiel würde die Serviceschicht also sagen, dass sie eine Fahrzeugentität laden muss, eine eindeutige Kennung hat und diese Kennung an das Repository sendet. Das Repository gibt die Fahrzeugentität zurück. Ein anderer Code manipuliert die Fahrzeugentität und sendet diese Entität an das Repository zurück, damit sie gespeichert werden kann.
Wenn Sie wirklich alles daran setzen möchten, würde die Repository-Schicht nur Schnittstellen wie ICarRepository verfügbar machen. Das Repository würde eine Factory enthalten , die die Service-Schicht verwenden würde, um die ICarRepository-Schnittstelle abzurufen. Der gesamte Datenbankzugriff würde hinter einer Schnittstelle verborgen sein, was das Testen von Einheiten erheblich vereinfacht.
quelle
Ich habe das Strategiemuster verwendet , um den Datenzugriff zu kapseln. Mit diesem Muster können Sie den Speichertyp, den Sie verwenden, hinter einer gemeinsamen Schnittstelle verbergen. Definieren Sie in der Benutzeroberfläche Ihre Datenzugriffsmethoden unter Berücksichtigung der Art des Speichers (Datei, Datenbank, Web). Implementieren Sie dann für Ihre aktuelle Speicherauswahl in einer Klasse, die die Strategie-Schnittstelle realisiert, die Datenzugriffsdetails. Auf diese Weise kümmert sich Ihre Anwendung nicht um die von Ihnen verwendete Datenquelle.
Sie können auch eine Service-Schicht erstellen, die die aktuelle Instanz der Datenspeicherungsstrategie verwendet, um anwendungsspezifische Details zu definieren, anstatt Datenzugriff und Geschäftslogik miteinander zu mischen.
quelle
Dies ist ein Beispiel für das Factory-Muster der Datenbank.
quelle