64
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh? André Krämer Softwareentwickler, Trainer, Berater

Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Embed Size (px)

DESCRIPTION

Wenn Sie sich Beispielcode im MSDN ansehen, dann wird Eines ganz schnell klar: Wer einen O/R-Mapper wie das Entity Framework oder NHibernate einsetzt, der sollte ihn mit dem Repository Pattern paaren. Idealerweise sogar mit generischen Repositories. Schließlich können Sie nur so den O/R-Mapper Ihrer Wahl vor den darüber liegenden Schichten verbergen. Aber ist dieses Versteckspiel vorteilhaft? Wie sinnvoll ist es wirklich, höhere Schichten bewusst dumm zu halten? Und gewinnen Sie auch Flexibilität durch diese Herangehensweise? Genau um diese Fragen geht es in diesem Vortrag. Anhand einiger Praxisbeispiele werden wir uns im Vergleich zu den typischen MSDN-Anwendungen ansehen, ob das Repository Pattern tatsächlich seine Berechtigung hat.

Citation preview

Page 1: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Das Repository-Pattern und der O/R-Mapper:

Geniale Kombination oder vergebene Liebesmüh?

André Krämer

Softwareentwickler, Trainer, Berater

Page 2: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Video Trainings ZertifizierungenAuszeichnungen

Page 3: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Was machen wir eigentlich den ganzen Tag?

Page 4: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Customer

Order OrderItem

Product

orders*

0…*

1

Page 5: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Name Street City Date

Customer Orders Id

OrderItem

City PriceShippe

d

Relation-ship

Relation-ship

Page 6: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

DataReader (.NET 1.0 Style)

using (connection) { SqlCommand command = new SqlCommand( "SELECT CategoryID, CategoryName FROM Categories;", connection);

connection.Open(); SqlDataReader reader = command.ExecuteReader();

if (reader.HasRows) { while (reader.Read()) { Console.WriteLine("{0}\t{1}", reader.GetInt32(0), reader.GetString(1)); } } else { Console.WriteLine("No rows found."); } reader.Close(); }

Page 7: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

30 % der Arbeitszeit sind verloren

Page 8: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

• ?

?

Page 9: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

ORMs (Entity Framework)

Page 10: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

NHibernate

Page 11: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

OR-Mapper

• Abbildung von Tabellen auf Klassen• Objektorientierte Sicht auf die Datenbank• Es muss kein SQL mehr geschrieben werden• Eine weitere Abstraktionsschicht

Page 12: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Einsatz des O/R Mappers

Page 13: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4

Page 14: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4

Page 15: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4

Page 16: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

public ActionResult Index(){}

public ActionResult Details(){}public ActionResult Create(){}public ActionResult Edit(){}

public ActionResult Delete(){}

Daten-bank

EF Context & Models

Page 17: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Typischer Einsatz desO/R MappersIn Kombination mit dem Repository Entwurfsmuster

Page 18: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Entwurfsmuster

• Lösungsschablone für wiederkehrende Probleme• Keine direkte Lösung, sondern Beschreibung eines

praxiserprobten Lösungswegs

Page 19: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Repository Muster

Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.

Page 20: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Repository Muster (2)

• Client objects construct query specifications declaratively and submit them to Repository for satisfaction

• Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code […] will carry out the appropriate operations […]

Page 21: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Anwendung desRepository Muster

Page 22: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Variante 1

Page 23: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 24: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 25: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Variante 2

Page 26: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 27: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 28: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 29: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

public ActionResult Index(){}

public ActionResult Details(){}public ActionResult Create(){}public ActionResult Edit(){}

public ActionResult Delete(){}

Daten-bank

EF Context & Models

Repository

Page 30: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Gründe für den Einsatz

Page 31: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Warum Repositories?

• Austauschbarkeit der Datenzugriffsschicht durch Kapselung

• Wiederverwendbarkeit komplexer Abfragen durch Kapselung

• Testbarkeit• Haben wir immer schon so gemacht• Ziel liegt in der Entkopplung

Page 32: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

O/R Mapper + Repository =

Page 33: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Wiederverwendbarkeit komplexer Abfragen durch Kapselung

Page 34: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 35: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 36: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

• Keine Filter in der Datenbank• Keine Sortierung in der Datenbank• Kein Include oder Prefetching

Page 37: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 38: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 39: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Folgen der Abfragekapselung

• Umfangreiche Repository Klassen mit zu vielen Verantwortlichkeiten

• Geschäftslogik in der Datenzugriffsschicht

Page 40: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Wiederverwendbarkeit von Abfragen

Use Case 1

Use Case 2

Use Case 3

Use Case 4

Use Case 5

Page 41: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Wiederverwendbarkeit von Abfragen (2)

• Abfragen sind meist Use Case spezifisch• Änderung einer Abfrage für Use Case 1 kann Fehler in

anderen Use Cases erzeugen

Page 42: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Warum Repositories?

• Austauschbarkeit der Datenzugriffsschicht durch Kapselung

• Wiederverwendbarkeit komplexer Abfragen durch Kapselung• Testbarkeit• Haben wir immer schon so gemacht

Page 43: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Alternative Implementierung

Page 44: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Folgen von IQueryable als Rückgabe

• Abfragen werden nicht mehr gekapselt• Unabhängigkeit von der darunter liegenden

Datenzugriffsschicht entfällt

Page 45: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Was ist falsch an diesem Code?

Page 46: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Er läuft unter NHibernate nicht

http://stackoverflow.com/questions/14458050/sum-of-top-5-elements-in-nhibernate-linq

Page 47: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Warum Repositories?

• Austauschbarkeit der Datenzugriffsschicht durch Kapselung

• Wiederverwendbarkeit komplexer Abfragen durch Kapselung• Testbarkeit• Haben wir immer schon so gemacht

Page 48: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Testbarkeit

• Der Einsatz von Repositories ermöglicht Unit Tests der aufrufenden Klasse (Controller, Business Service)

• EF DbContext kann „gemocked“ werden

Page 49: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

DBSetHelper Klasse

Page 50: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Warum Repositories?

• Austauschbarkeit der Datenzugriffsschicht durch Kapselung

• Wiederverwendbarkeit komplexer Abfragen durch Kapselung• Testbarkeit• Haben wir immer schon so gemacht

Page 51: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Haben wir schon immer so gemacht

• Repository Pattern entstand, bevor es O/R Mapper gab• SQL wurde per Stringverkettung erzeugt• Primär wurde mit Recordsets gearbeitet• Connection Management war komplex

• Ziel war es, diese Komplexität zu verstecken

Page 52: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Warum Repositories?

• Austauschbarkeit der Datenzugriffsschicht durch Kapselung

• Wiederverwendbarkeit komplexer Abfragen durch Kapselung• Testbarkeit• Haben wir immer schon so gemacht

Page 53: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

BonusfrageWas ist problematisch an folgendem Code?

Page 54: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 55: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Alternativen

Page 56: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Einsatz von O/R Mappern im UI Code

• Manchmal!

Page 57: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 58: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Query Objekte

Page 59: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?
Page 60: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Fazit

Page 61: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Repositories

• Vermitteln zwischen Domain und Data-Mapping Schicht • Isoliert Domänen Objekte vom Datenzugriffscode• Verhält sich wie eine Collection• Stellt eine objektorientierte Sicht bereit

Page 62: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Repositories

• Vermitteln zwischen Domain und Data-Mapping Schicht • Isoliert Domänen Objekte vom Datenzugriffscode• Verhält sich wie eine Collection• Stellt eine objektorientierte Sicht bereit

O/R Mapper

Page 63: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

Repositories

• Lösen ein Problem, das auch der O/R Mapper löst• Sind eine weitere Abstraktion, deren Pflege Kosten

verursacht• Bereiten auf die 1%ige Wahrscheinlichkeit vor, dass der

O/R Mapper getauscht werden soll

Page 64: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?

64

Homepage

[email protected] | http://andrekraemer.de | http://andrekraemer.de/blog

Vielen Dank!

Blog

Xing

Facebook

Twitter

Google+

Schulung und Beratung mit den Schwerpunkten:• Windows 8 und Windows Phone Apps• ASP.NET MVC, Web API & JavaScript• Team Foundation Server / ALM• Automatische Dokumentengenerierung mit TX Text

Control• Performance- & Memory Analysen• Softwarearchitektur