Was ist der Unterschied zwischen dem Data Mapper, Table Data Gateway (Gateway), Data Access Object (DAO) und Repository-Muster?

StackOverflow https://stackoverflow.com/questions/804751

Frage

Ich versuche, auf meinen Design-Mustern Fähigkeiten zu auffrischen, und ich bin gespannt, was die Unterschiede zwischen diesen Mustern sind? Alle von ihnen scheinen, wie sie dasselbe sind - kapseln die Datenbanklogik für eine bestimmte Einheit so der anruf Code hat keine Kenntnis der zugrunde liegenden Persistenz-Schicht. Aus meiner kurzen Forschung alle von ihnen typischerweise Ihre Standard CRUD Methoden implementieren und abstrakt die Datenbank-spezifische Details weg.

Neben Namenskonventionen (z CustomerMapper vs. CustomerDAO vs. CustomerGateway vs. CustomerRepository), was der Unterschied ist, wenn überhaupt? Wenn es einen Unterschied, wenn würde wählten Sie einen über den anderen?

In der Vergangenheit habe ich Code schreiben würde wie die folgende (vereinfacht, natürlich - ich normalerweise nicht öffentliche Eigenschaften verwenden):

public class Customer
{
    public long ID;
    public string FirstName;
    public string LastName;
    public string CompanyName;
}

public interface ICustomerGateway
{
    IList<Customer> GetAll();
    Customer GetCustomerByID(long id);
    bool AddNewCustomer(Customer customer);
    bool UpdateCustomer(Customer customer);
    bool DeleteCustomer(long id);
}

und eine CustomerGateway Klasse, die die spezifische Datenbanklogik für alle Methoden implementiert. Manchmal würde ich nicht eine Schnittstelle verwenden und alle Methoden auf dem CustomerGateway statisch machen (ich weiß, ich weiß, das macht es weniger prüfbar) so kann ich es nennen mag:

Customer cust = CustomerGateway.GetCustomerByID(42);

Dies scheint das gleiche Prinzip für den Data Mapper und Repository-Muster zu sein; das DAO-Muster (was dasselbe wie Gateway ist, glaube ich?) auch datenbankspezifische Gateways zu fördern.

scheint

Bin ich etwas fehlt? Es scheint ein wenig seltsam 3-4 verschiedene Möglichkeiten, die die gleiche genaue Sache zu haben.

War es hilfreich?

Lösung

Ihr Beispiel Begriffe; DataMapper, DAO, DataTableGateway und Repository, alle haben einen ähnlichen Zweck (wenn ich eine verwenden, erwarte ich ein Customer-Objekt zurück zu bekommen), aber unterschiedliche Absicht / Bedeutung und die daraus resultierende Umsetzung.

Repository "wirkt wie eine Sammlung, bis mit komplizierteren Abfragen Fähigkeit" [ Evans, Domain Driven Design ] und kann als "Objekte im Speicher Fassade" ( Repository Diskussion )

DataMapper "verschiebt Daten zwischen Objekten und einer Datenbank, während sie unabhängig voneinander zu halten und den Mapper selbst" ( Fowler, PoEAA, Mapper )

TableDataGateway ist „ein Gateway (Objekt, das den Zugang zu einem externen System oder einer Ressource kapselt) zu einer Datenbanktabelle. Ein Beispiel kümmert sich um alle Zeilen in der Tabelle “ ( Fowler, PoEAA, TableDataGateway )

DAO "eine Client-Schnittstelle des trennt Datenressource von seinen Datenzugriffsmechanismen / paßt sich eine bestimmte Zugriffs API Datenressource zu einer allgemeinen Client-Schnittstelle" erlaubt “ Datenzugriffsmechanismen unabhängig von dem Code zu ändern, dass die Daten " verwendet ( Sun Riss )

Repository scheint sehr allgemein, keine Ahnung von Datenbank-Interaktion auszusetzen. Ein DAO stellt eine Schnittstelle verschiedene zugrunde liegende Datenbank-Implementierungen ermöglichen, verwendet werden. Ein TableDataGateway ist speziell eine dünne Hülle um einen einzigen Tisch. A DataMapper fungiert als Vermittler das Modellobjekt ermöglicht, unabhängig von der Datenbankdarstellung zu entwickeln (über die Zeit).

Andere Tipps

Es gibt eine Tendenz in der Software-Design-Welt (zumindest, ich fühle mich so) neue Namen für bekannte alte Dinge und Muster zu erfinden. Und wenn wir ein neues Paradigma haben (die vielleicht etwas von bereits existierenden Dingen unterscheiden), es kommt in der Regel mit einer ganzen Reihe neuer Namen für jede Ebene. So „Business Logic“ wird „Service Layer“, nur weil wir sagen, dass wir SOA tun, und DAO wird Repository, nur weil wir sagen, dass wir DDD tun (und jeder von denen ist nicht wirklich etwas Neues und Einzigartiges überhaupt, aber wieder neue Namen für bereits bekannte Konzepte im selben Buch gesammelt). Also ich sage nicht, dass alle diese modernen Paradigmen und Akronyme bedeuten genau die gleiche Sache, aber Sie sollten wirklich nicht zu paranoid darüber. Meistens sind dies die gleichen Muster, nur aus verschiedenen Familien.

Data Mapper vs Table Data Gateway Um es kurz zu machen:

  • die Data Mapper das Domänenmodell Objekt (Entity) als param erhalten und es verwenden, werden die CRUD-Operationen zu implementieren
  • die Table Data Gateway wird erhält alle params (als Primitive) für die Verfahren und wird nichts über die Domain Model-Objekt kennen (Entity).

    Am Ende beide als Vermittler zwischen den in-memory Objekten wirken und die Datenbank.

        
  • Sie haben einen guten Punkt. Wählen Sie die, die Sie am besten vertraut sind mit. Ich mag einige Dinge hinweisen, die klären kann helfen.

    Die Table Data Gateway ist in erster Linie für eine einzelne Tabelle oder Sicht verwendet. Es enthält alle wählen, Einfügungen, Aktualisierungen und Löschungen. So Kunde ist eine Tabelle oder eine Ansicht in Ihrem Fall. So behandelt eine Instanz eines Tabellendaten-Gateway-Objekt alle Zeilen in der Tabelle. Normalerweise ist dies in Bezug auf ein Objekt pro Datenbanktabelle.

    Während Data Mapper ist unabhängig von jeder Domain-Logik und ist weniger gekoppelt (obwohl ich glaube, es entweder Kupplung oder nicht Kopplung). Es ist nur eine Zwischenschicht, die Daten zwischen den Objekten und einer Datenbank zu übertragen, während sie unabhängig voneinander sind und der Mapper selbst zu halten.

    So, in der Regel in einem Mapper finden Sie Methoden wie Einfügen, Aktualisieren, Löschen und in Tabellendaten-Gateway finden Sie getcustomerbyId, getcustomerbyName, etc.

    Datentransferobjekt unterscheidet sich von den beiden oben genannten Muster, vor allem, weil es sich um ein Verteilungsmuster ist und kein Datenquellenmuster wie oben zwei Muster. Verwenden Sie es, vor allem, wenn Sie mit Remote-Schnittstelle arbeiten und brauchen Ihre Anrufe weniger gesprächig als jeder Anruf tätigen teuer werden. Also in der Regel ein DTO entwerfen, die über Draht serialisiert werden können, die alle Daten zurück an den Server für die Anwendung weitere Geschäftsregeln oder Verarbeitung führen können.

    ich gut bin nicht in Repository-Muster vertraut, da ich nicht die Chance bekommen, haben bis jetzt zu verwenden, sondern werden auf andere Antworten suchen.

    Unten ist nur mein Verständnis.

    TableGateWay / RowDataGateWay : In diesem Zusammenhang wird Bezug Gateway-eine spezifische Implementierung, die jedes „Domänenobjekt“ Mapping zu jedem „Domänenobjekt Gateway“ hat. Zum Beispiel, wenn wir Person , dann werden wir ein PersonGateway haben die Domain-Objekt-Person-Datenbank zu speichern. Wenn wir Person, Mitarbeiter, Kunde, etc., werden wir PersonGateway, EmployeeGateway und CustomerGateway haben. Jedes Gateway wird für dieses Objekt spezifische CRUD Funktion hat und es hat nichts mit anderem Gateway zu tun. Es gibt keine wieder verwendbaren Code / Modul hier. Das Gateway kann weiter in RowDataGateway oder TableGateway aufgeteilt wird, hängt ab, wenn Sie einen „id“ oder ein „Objekt“ übergeben. Gateway ist in der Regel im Vergleich zu aktiven Datensatz. Sie bindet Ihre Domain-Modell-Datenbankschema.

    Repository / DataMapper / DAO : Sie sind das Gleiche. Sie beziehen sich alle auf die Persistenz-Schicht, die Datenbankentitäten auf Domänenmodell übertragen. Im Gegensatz zu Gateway, versteckt das Repository / DataMapper / DAO die Umsetzung. Sie wissen nicht, ob es eine PersonGateway hinter Person ist. Es kann oder kann nicht, Sie kümmern sich nicht. Alles, was Sie wissen, ist, muss es für jede Domain-Objekt unterstützt CRUD-Operationen haben. Es entkoppeln die Datenquelle und Domänenmodell.

    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top