![Page 1: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/1.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/2.jpg)
Video Trainings ZertifizierungenAuszeichnungen
![Page 3: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/3.jpg)
Was machen wir eigentlich den ganzen Tag?
![Page 4: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/4.jpg)
Customer
Order OrderItem
Product
orders*
0…*
1
![Page 5: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/5.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/6.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/7.jpg)
30 % der Arbeitszeit sind verloren
![Page 8: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/8.jpg)
• ?
?
![Page 9: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/9.jpg)
ORMs (Entity Framework)
![Page 10: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/10.jpg)
NHibernate
![Page 11: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/11.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/12.jpg)
Einsatz des O/R Mappers
![Page 13: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/13.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/14.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/15.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/16.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/17.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/18.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/19.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/20.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/21.jpg)
Anwendung desRepository Muster
![Page 22: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/22.jpg)
Variante 1
![Page 23: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/23.jpg)
![Page 24: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/24.jpg)
![Page 25: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/25.jpg)
Variante 2
![Page 26: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/26.jpg)
![Page 27: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/27.jpg)
![Page 28: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/28.jpg)
![Page 29: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/29.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/30.jpg)
Gründe für den Einsatz
![Page 31: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/31.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/32.jpg)
O/R Mapper + Repository =
![Page 33: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/33.jpg)
Wiederverwendbarkeit komplexer Abfragen durch Kapselung
![Page 34: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/34.jpg)
![Page 35: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/35.jpg)
![Page 36: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/36.jpg)
• 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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/37.jpg)
![Page 38: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/38.jpg)
![Page 39: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/39.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/40.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/41.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/42.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/43.jpg)
Alternative Implementierung
![Page 44: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/44.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/45.jpg)
Was ist falsch an diesem Code?
![Page 46: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/46.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/47.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/48.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/49.jpg)
DBSetHelper Klasse
![Page 50: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/50.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/51.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/52.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/53.jpg)
BonusfrageWas ist problematisch an folgendem Code?
![Page 54: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/54.jpg)
![Page 55: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/55.jpg)
Alternativen
![Page 56: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/56.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/57.jpg)
![Page 58: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/58.jpg)
Query Objekte
![Page 59: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/59.jpg)
![Page 60: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/60.jpg)
Fazit
![Page 61: Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/61.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/62.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/63.jpg)
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?](https://reader034.vdokument.com/reader034/viewer/2022051612/54c31aeb4a795913608b4596/html5/thumbnails/64.jpg)
64
Homepage
[email protected] | http://andrekraemer.de | http://andrekraemer.de/blog
Vielen Dank!
Blog
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