Repository-Muster im Vergleich zur DAO-Verwaltung von Entitäten

10

Ich bin neu in Konzepten wie DAO, DAL und Domain Driven Design. Am Ende möchte ich die Persistenzschicht (MySQL-Datenbank) von meinen Geschäftsobjekten und meiner Logik in einer Webanwendung entkoppeln. Das DAO-Konzept hat mir gefallen, aber ich konnte es nicht implementieren, wenn ich ein Geschäftsobjekt aus einer Datenbank erstellen möchte, der andere Entitäten zugeordnet sind (dargestellt durch einen Fremdschlüssel in der DB-Tabelle).

  1. Wie werden diese Referenzen (Aggregationen) mit DAO-Mustern behandelt? Jedes Online-DAO-Beispiel ist einfach und zeigt nur die Erstellung von wertobjektähnlichen Geschäftsobjekten (ohne auf andere Entitäten oder Wertobjekte zu verweisen). Wird es mit Dependency Injection durchgeführt und wenn ja, wo wird die Abhängigkeit erstellt?
  2. Wenn ich weiter lese, denke ich, dass das Repository-Muster von DDD die Möglichkeit bietet, DAOs hinter den Kulissen zu verwenden und Objektaggregationen zu handhaben. So wie ich es verstehe, liefert es nur die sogenannte Wurzel (Entität mit allen geladenen oder faul geladenen Referenzen) für die Außenwelt, was für mich ein guter Ansatz zu sein scheint. Wird das Repository bei Verwendung von DAO empfohlen oder können DAOs diese Funktionalität selbst bereitstellen, indem sie die Persistenz-Ignoranz für die Geschäftsobjekte beibehalten.

Ich verwende kein ORM-Tool und möchte dies nicht, da ich diese grundlegenden Muster direkt untersuchen möchte

Michbeckable
quelle
Sry, ich fand diese Frage hier besser geeignet. Ich lösche es im Stackoverflow.
Michbeckable
Welches Sprachframework verwenden Sie? Wenn Sie konkrete Beispiele wollen ... sollten Sie wahrscheinlich auch Martin Fawlers Artikel zu diesem Thema nachschlagen.
AK_
Patterns of Enterprise Architecture enthält einen umfangreichen Abschnitt zu Datenzugriffsmustern. Wenn ich mich richtig erinnere, ist Fowlers Table Data Gateway analog zu einem DAO, sodass viele der Muster, die er in diesem Buch beschreibt, in ORM-Bibliotheken implementiert wurden.
Mike Partridge

Antworten:

4

Es gibt zwei Probleme, die orthogonal zueinander sind:

1) Das untere Ende der Persistenz

Hier müssen Sie sich mit Verbindungen , Abfragen , Ergebnismengen und dergleichen befassen . Normalerweise verwenden Sie das eine oder andere Framework, das Ihnen ein Fassadenmuster zur Hand gibt, das das schmutzige Zeug weg abstrahiert, sodass Sie nur sagen, was Sie wissen möchten (Resultset from Query) und wo das Framework es finden könnte ( Abfrage und Verbindung). Was Sie mit der Ergebnismenge machen, liegt bei Ihnen.

Wenn Ihr Paradigma OOP ist, ist ein zusätzlicher Schritt erforderlich: Zusammensetzen der Ergebnismenge zu Objekten. Entweder Sie machen es manuell oder Sie haben einen objektrelationalen Mapper , der die Arbeit für Sie erledigt .

2) Die Abstraktion in Ihrer Anwendung Auf dieser Ebene befindet sich die Abstraktion, mit der sich Ihre Anwendung befasst. Es gibt den DataAccessObject (DAO) -Layer oder den Repository -Layer. Beide generieren Objekte, mit denen Ihre Anwendung arbeiten kann.

Welches Sie verwenden, hat keinen Einfluss auf die Antwort auf Ihre Frage.

Ihre Frage bezieht sich zum einen auf die Modellierung ( »Umgang mit Beziehungen zwischen Objekten« Antwort: über Komposition / Aggregation ) und zum Füllen des Objekts (und seiner Abhängigkeiten) mit Daten.

Wird es mit Dependency Injection durchgeführt und wenn ja, wo wird die Abhängigkeit erstellt?

Dies ist der richtige Weg. Es gibt zwei Möglichkeiten:

1) Sie machen den DI explizit und definieren einen Konstruktor. Beim Erstellen des Objekts können Sie zuerst alle Abhängigkeiten erstellen und sie über die Konstruktor- oder Setter-Injektion einfügen

2) Sie verwenden ein Framework, das die Magie für Sie erledigt. Oft ist Reflexion involviert, dh es gibt in einigen Sprachen Möglichkeiten, Objekte im laufenden Betrieb zu untersuchen und zu manipulieren. Die Injektion erfolgt transparent für den Benutzer durch das Framework.

Dies ist unabhängig vom DAO / Repository-Muster.

Ich verwende kein ORM-Tool und möchte dies nicht, da ich diese grundlegenden Muster direkt untersuchen möchte

Das ist ein nobler Ansatz, aber nicht in jedem Fall produktiv. Meistens möchten Sie Dinge erledigen. Zu Bildungszwecken könnten Sie diesen Weg gehen. Aber ich würde es nicht empfehlen.

Achten Sie auf ein flexibles ORM-Framework, das Ihnen bei Bedarf hilft, ohne Sie auf die eine oder andere Weise zu zwingen. Nicht in jedem Fall ist die von ootB generierte Abfrage wirksam. Mit einem guten Framework können Sie bei Bedarf SQL verwenden und sich nur um das Zusammenbauteil kümmern .

Thomas Junk
quelle
1

Hier bietet sich ORM (Object Relational Mapping) an. Es gibt Bibliotheken für viele Programmiersprachen, die diese Art von Programmiertechniken bereitstellen. Zum Beispiel für Java gibt es Hibernate . Der Ruhezustand funktioniert mit Java-Anmerkungen. Hier ist ein einfaches Beispiel für eine Beziehung von vielen zu eins aus der offiziellen Dokumentation :

@Entity
public class Flight implements Serializable {
    @ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}
sfat
quelle