Transcript
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


Recommended