2012-11-25 13 views
22

Ich habe zwei Muster gefunden, die scheinbar dasselbe Ziel haben - was ist der Unterschied?Wie unterscheidet sich das Data-Mapper-Muster vom Repository-Muster?

http://martinfowler.com/eaaCatalog/dataMapper.html

http://martinfowler.com/eaaCatalog/repository.html

+1

Wenn Ihr Data Mapper zu groß ist oder eine große Menge an Abfragen verarbeitet, als Objekte tatsächlich zuzuordnen, führen Sie eine andere Klasse ein, die sich auf die Abfrage von Teilen konzentriert, die Sie als Repository-Muster bezeichnen. – Rockstart

Antwort

37

[Das Repository ist] eine weitere Abstraktionsschicht über der Abbildungs ​​ Schicht, wo query Konstruktionscode konzentriert.

Die DataMapper sichert die DB Seite des Zauns muss nicht über die Besonderheiten Ihrer Business-Logik wissen, und wie die Daten im Speicher, indem Sie Ihre Business-Objekte und Ihre Business-Seite des Zauns nicht gehalten müssen wissen, wie die Daten gespeichert sind.

Zur Veranschaulichung, beachten Sie, dass Ihre Daten in der Datenbank als eine Reihe von Zeilen gespeichert werden, sagen jede Zeile ein Element in Ihrem Geschäft. Auf der In-Memory-Seite möchten Sie diese Informationen möglicherweise nicht als Liste von StoreItem speichern, sondern als zwei Listen, eine für Artikel, die auf Lager sind, und eine andere für nicht vorrätige Artikel. Es wäre der DataMapper 's Job, den Übergang zwischen einer Liste und zwei Listen zu behandeln.

Sie können Dinge komplizieren, indem Sie Listen anderer Objekte und Vererbung auf der Geschäftsseite des Zauns hinzufügen. Der 'DataMapper' müsste von und zu dieser Repräsentation in die relationale DB übersetzen.

Die 'Repository' bietet die Business-Seite die "SELECT * FROM Tabelle WHERE-Bedingung" -Funktionalität. Sie stellen einen Filter bereit und es wird eine Sammlung von Objekten zurückgegeben, die mit diesem Filter übereinstimmen.

Kurz gesagt: Der 'DataMapper' befasst sich mit einzelnen Objekten, das 'Repository' befasst sich mit Objektsammlungen und erweitert die Funktionalität des 'DataMapper'.

+0

Schöne Erklärung, können Sie ein Beispiel geben, wie diese abweichen können. Von dem, was ich in Java, .NET und PHP-Frameworks sehe, scheinen die beiden Konzepte austauschbar zu sein und es ist sehr verwirrend. –

+1

@LordYggdrasill Wenn Sie ein bestimmtes Problem mit einem bestimmten Framework haben, sollten Sie es in Form einer Frage auf dieser Site präsentieren. Abfragen und Mapping sind logisch unterschiedliche Aufgaben, aber ihre * Implementierungen * sind oft eng gekoppelt, was erklären könnte, warum einige (Zitat benötigt) sie zusammen betrachten könnten. – Andrei

+0

Nun, hier habe ich ein Beispiel von der ASP.NET-Website. Wie Sie sehen können, sieht ihre Implementierung des Repository-Musters genau so aus wie die Data Mapper von Martin Fowler in POEAA. Kannst du dieses Phänomen erklären? Vielleicht ist das Repository von ASP.NET tatsächlich ein Data Mapper? http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns- in-a-asp-net-mvc-application –

Verwandte Themen