Das Repository-Pattern 
und der O/R-Mapper: 
Geniale Kombination oder 
vergebene Liebesmüh? 
André Krämer 
Softwareentwick...
Video Auszeichnungen Trainings Zertifizierungen
Was machen wir eigentlich den 
ganzen Tag?
Customer 
Order OrderItem 
Product 
orders* 
0…* 
1
Name Street City Date 
Relation-ship 
Customer Orders Id 
Relation-ship 
OrderItem 
City Price Shipped
DataReader (.NET 1.0 Style) 
using (connection) 
{ 
SqlCommand command = 
new SqlCommand( "SELECT CategoryID, CategoryName...
30 % der Arbeitszeit sind verloren
• ? 
?
ORMs (Entity Framework)
NHibernate
OR-Mapper 
• Abbildung von Tabellen auf Klassen 
• Objektorientierte Sicht auf die Datenbank 
• Es muss kein SQL mehr gesc...
Einsatz des O/R Mappers
Beispiel entnommen aus: 
http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
Beispiel entnommen aus: 
http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
Beispiel entnommen aus: 
http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
public ActionResult Index() 
{ 
} 
public ActionResult Details() 
{ 
} 
public ActionResult Create() 
{ 
} 
public ActionR...
Typischer Einsatz des 
O/R Mappers 
In Kombination mit dem Repository Entwurfsmuster
Entwurfsmuster 
• Lösungsschablone für wiederkehrende Probleme 
• Keine direkte Lösung, sondern Beschreibung eines praxise...
Repository Muster 
Mediates between the domain and data mapping 
layers using a collection-like interface for accessing 
d...
Repository Muster (2) 
• Client objects construct query specifications declaratively and 
submit them to Repository for sa...
Anwendung des 
Repository Muster
Variante 1
Variante 2
public ActionResult Index() 
{ 
} 
public ActionResult Details() 
{ 
} 
public ActionResult Create() 
{ 
} 
public ActionR...
Gründe für den Einsatz
Warum Repositories? 
• Austauschbarkeit der Datenzugriffsschicht durch Kapselung 
• Wiederverwendbarkeit komplexer Abfrage...
O/R Mapper + 
Repository =
Wiederverwendbarkeit 
komplexer Abfragen 
durch Kapselung
• Keine Filter in der Datenbank 
• Keine Sortierung in der Datenbank 
• Kein Include oder Prefetching
Folgen der Abfragekapselung 
• Umfangreiche Repository Klassen mit zu vielen Verantwortlichkeiten 
• Geschäftslogik in der...
Wiederverwendbarkeit von Abfragen 
Use 
Case 1 
Use 
Case 2 
Use 
Case 3 
Use 
Case 4 
Use 
Case 5
Wiederverwendbarkeit von Abfragen (2) 
• Abfragen sind meist Use Case spezifisch 
•  Änderung einer Abfrage für Use Case ...
Warum Repositories? 
• Austauschbarkeit der Datenzugriffsschicht durch Kapselung 
• Wiederverwendbarkeit komplexer Abfrage...
Alternative Implementierung
Folgen von IQueryable als Rückgabe 
• Abfragen werden nicht mehr gekapselt 
• Unabhängigkeit von der darunter liegenden Da...
Was ist falsch an diesem Code?
Er läuft unter NHibernate nicht 
http://stackoverflow.com/questions/14458050/sum-of-top-5-elements-in-nhibernate-linq
Warum Repositories? 
• Austauschbarkeit der Datenzugriffsschicht durch Kapselung 
• Wiederverwendbarkeit komplexer Abfrage...
Testbarkeit 
• Der Einsatz von Repositories ermöglicht Unit Tests der aufrufenden 
Klasse (Controller, Business Service) 
...
DBSetHelper Klasse
Warum Repositories? 
• Austauschbarkeit der Datenzugriffsschicht durch Kapselung 
• Wiederverwendbarkeit komplexer Abfrage...
Haben wir schon immer so gemacht 
• Repository Pattern entstand, bevor es O/R Mapper gab 
• SQL wurde per Stringverkettung...
Warum Repositories? 
• Austauschbarkeit der Datenzugriffsschicht durch Kapselung 
• Wiederverwendbarkeit komplexer Abfrage...
Bonusfrage 
Was ist problematisch an folgendem Code?
Alternativen
Einsatz von O/R Mappern im UI Code 
• Manchmal!
Query Objekte
Fazit
Repositories 
• Vermitteln zwischen Domain und Data-Mapping Schicht 
• Isoliert Domänen Objekte vom Datenzugriffscode 
• V...
Repositories 
• Vermitteln zwischen Domain und Data-Mapping Schicht 
• Isoliert Domänen Objekte vom Datenzugriffscode 
• V...
Repositories 
• Lösen ein Problem, das auch der O/R Mapper löst 
• Sind eine weitere Abstraktion, deren Pflege Kosten veru...
Vielen Dank! 
Homepage 
Blog 
Xing 
Facebook 
Twitter 
Google+ 
andre@andrekraemer.de | http://andrekraemer.de | http://an...
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?
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?
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?
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?
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?
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?
Nächste SlideShare
Wird geladen in …5
×

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

2.516 Aufrufe

Veröffentlicht am

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.

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
2.516
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
1.526
Aktionen
Geteilt
0
Downloads
13
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

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

  1. 1. Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene Liebesmüh? André Krämer Softwareentwickler, Trainer, Berater
  2. 2. Video Auszeichnungen Trainings Zertifizierungen
  3. 3. Was machen wir eigentlich den ganzen Tag?
  4. 4. Customer Order OrderItem Product orders* 0…* 1
  5. 5. Name Street City Date Relation-ship Customer Orders Id Relation-ship OrderItem City Price Shipped
  6. 6. 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(); }
  7. 7. 30 % der Arbeitszeit sind verloren
  8. 8. • ? ?
  9. 9. ORMs (Entity Framework)
  10. 10. NHibernate
  11. 11. OR-Mapper • Abbildung von Tabellen auf Klassen • Objektorientierte Sicht auf die Datenbank • Es muss kein SQL mehr geschrieben werden • Eine weitere Abstraktionsschicht
  12. 12. Einsatz des O/R Mappers
  13. 13. Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
  14. 14. Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
  15. 15. Beispiel entnommen aus: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4
  16. 16. public ActionResult Index() { } public ActionResult Details() { } public ActionResult Create() { } public ActionResult Edit() { } public ActionResult Delete() { } Daten-bank EF Context & Models
  17. 17. Typischer Einsatz des O/R Mappers In Kombination mit dem Repository Entwurfsmuster
  18. 18. Entwurfsmuster • Lösungsschablone für wiederkehrende Probleme • Keine direkte Lösung, sondern Beschreibung eines praxiserprobten Lösungswegs
  19. 19. Repository Muster Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.
  20. 20. 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 […]
  21. 21. Anwendung des Repository Muster
  22. 22. Variante 1
  23. 23. Variante 2
  24. 24. public ActionResult Index() { } public ActionResult Details() { } public ActionResult Create() { } public ActionResult Edit() { } public ActionResult Delete() { } Daten-bank Repository EF Context & Models
  25. 25. Gründe für den Einsatz
  26. 26. Warum Repositories? • Austauschbarkeit der Datenzugriffsschicht durch Kapselung • Wiederverwendbarkeit komplexer Abfragen durch Kapselung • Testbarkeit • Haben wir immer schon so gemacht •  Ziel liegt in der Entkopplung
  27. 27. O/R Mapper + Repository =
  28. 28. Wiederverwendbarkeit komplexer Abfragen durch Kapselung
  29. 29. • Keine Filter in der Datenbank • Keine Sortierung in der Datenbank • Kein Include oder Prefetching
  30. 30. Folgen der Abfragekapselung • Umfangreiche Repository Klassen mit zu vielen Verantwortlichkeiten • Geschäftslogik in der Datenzugriffsschicht
  31. 31. Wiederverwendbarkeit von Abfragen Use Case 1 Use Case 2 Use Case 3 Use Case 4 Use Case 5
  32. 32. 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
  33. 33. Warum Repositories? • Austauschbarkeit der Datenzugriffsschicht durch Kapselung • Wiederverwendbarkeit komplexer Abfragen durch Kapselung • Testbarkeit • Haben wir immer schon so gemacht
  34. 34. Alternative Implementierung
  35. 35. Folgen von IQueryable als Rückgabe • Abfragen werden nicht mehr gekapselt • Unabhängigkeit von der darunter liegenden Datenzugriffsschicht entfällt
  36. 36. Was ist falsch an diesem Code?
  37. 37. Er läuft unter NHibernate nicht http://stackoverflow.com/questions/14458050/sum-of-top-5-elements-in-nhibernate-linq
  38. 38. Warum Repositories? • Austauschbarkeit der Datenzugriffsschicht durch Kapselung • Wiederverwendbarkeit komplexer Abfragen durch Kapselung • Testbarkeit • Haben wir immer schon so gemacht
  39. 39. Testbarkeit • Der Einsatz von Repositories ermöglicht Unit Tests der aufrufenden Klasse (Controller, Business Service) • EF DbContext kann „gemocked“ werden
  40. 40. DBSetHelper Klasse
  41. 41. Warum Repositories? • Austauschbarkeit der Datenzugriffsschicht durch Kapselung • Wiederverwendbarkeit komplexer Abfragen durch Kapselung • Testbarkeit • Haben wir immer schon so gemacht
  42. 42. 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
  43. 43. Warum Repositories? • Austauschbarkeit der Datenzugriffsschicht durch Kapselung • Wiederverwendbarkeit komplexer Abfragen durch Kapselung • Testbarkeit • Haben wir immer schon so gemacht
  44. 44. Bonusfrage Was ist problematisch an folgendem Code?
  45. 45. Alternativen
  46. 46. Einsatz von O/R Mappern im UI Code • Manchmal!
  47. 47. Query Objekte
  48. 48. Fazit
  49. 49. 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
  50. 50. 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
  51. 51. 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
  52. 52. Vielen Dank! Homepage Blog Xing Facebook Twitter Google+ andre@andrekraemer.de | http://andrekraemer.de | http://andrekraemer.de/blog 64 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

×