SlideShare ist ein Scribd-Unternehmen logo
1 von 29
CQRS in der Praxis
NEWSLETTER DOUBLE-OPT-IN
MVC – Pattern
• 1979 formuliert
• Softwareentwurf für Desktop-Anwendungen
MVC – Pattern – klassisch
Controller
Model
View
View
ServerClient
MVC – Pattern – Web
Controller ModelView
ServerClient
Controller ModelView
MVC – Pattern – Web
ServerClient
Controller ModelView
MVC – Pattern – Web
MVC – Pattern – Web
ServerClient
Controller ModelView
Server
MVC – Pattern – Web
Client
Controller ModelView
MVC – Pattern – Web – Probleme
• Systemgrenze
• HTTP-Request
• Subject-Observer
• Single-Responsibility
MVC – Pattern – Web – Probleme
• HTTP-Request
• Subject-Observer
• Single-Responsibility
MVC – Pattern – Web – Probleme
• HTTP-Request
• Subject-Observer
• Single-Responsibility
MVC – Pattern – Web – Probleme
• HTTP-Request
• Single-Responsibility
Server
HTTP-Request
Client
Controller
Model
View
GET
Client Server
HTTP-Request
Read
Controller
Model
View
GET
Client Server
HTTP-Request
Read
Controller
Model
View
GET
Write
Controller
POST
Client Server
HTTP-Request
Read
Controller
Model
View
GET
Write
Controller
POST
Probleme
• HTTP-Request
• Single-Responsibility
Probleme
• Single-Responsibility
Client Server
Single-Responsibility
Read
Controller
Model
View
GET
Write
Controller
POST
Client Server
Single-Responsibility
Read
Controller
Model
View
GET
POST
Read
Handler
Write
Handler
Write
Controller
Client Server
CQRS
Read
Controller
Model
View
GET
POST
Read
Handler
Write
Handler
Write
Controller
Client Server
CQRS – Command Query Responsibilty Segregation
Read
Controller
Model
View
GET
POST
Query
Handler
Command
Handler
Write
Controller
Livecoding
Newsletter Double-Opt-In – User Stories
• Als User kann ich meine E-Mail Adresse anmelden, um den Newsletter zu
erhalten.
• Als User erhalte ich eine E-Mail nach Anmeldung, um diese zu bestätigen.
• Als User kann ich die Bestätigungs-E-Mail erneut anfordern, um meine E-Mail
Adresse zu bestätigen.
• Als User kann ich meine E-Mail Adresse bestätigen, um die Anmeldung
abzuschließen.
• Als User erhalte ich eine Welcome E-Mail, sodass ich über den Abschluss der
Anmeldung informiert bin.
Client
CQRS + SOA – Our best practice
Query
Handler
Reposi-
tory
View
GET
POST
GetRequest
Handler
PostRequest
Handler
Called dynamically
Command
Handler
ReadService
Query
WriteService
Command
Called explicitly
Empfehlungen
• Einführung in CQRS
http://martinfowler.com/bliki/CQRS.html
• MVC in Webanwendungen
https://entwickler.de/online/php/model-view-controller-in-webanwendungen-
138762.html
• Wartbares Design dank CQRS
https://entwickler.de/online/development/wartbares-design-dank-cqrs-
139615.html
Empfehlungen
https://github.com/fortuneglobe/icehawk
Vielen Dank
• Slides abrufbar
http://www.phpind.de
• Beispiel-Projekt abrufbar
https://github.com/PHPinDD/cqrs-newsletter-double-opt-in

Weitere ähnliche Inhalte

Was ist angesagt?

Enterprise JavaBeans und Web Application
Enterprise JavaBeans und Web ApplicationEnterprise JavaBeans und Web Application
Enterprise JavaBeans und Web Application
private
 

Was ist angesagt? (15)

JUG MZ OSGi Lightning Talk
JUG MZ OSGi Lightning TalkJUG MZ OSGi Lightning Talk
JUG MZ OSGi Lightning Talk
 
Creasoft-Akademie - Mobile Multiplattform Apps
Creasoft-Akademie - Mobile Multiplattform AppsCreasoft-Akademie - Mobile Multiplattform Apps
Creasoft-Akademie - Mobile Multiplattform Apps
 
Workshop Vue js
Workshop Vue jsWorkshop Vue js
Workshop Vue js
 
PrettyFaces: RESTful URLs für JSF
PrettyFaces: RESTful URLs für JSFPrettyFaces: RESTful URLs für JSF
PrettyFaces: RESTful URLs für JSF
 
Azure Bootcamp Hamburg
Azure Bootcamp Hamburg Azure Bootcamp Hamburg
Azure Bootcamp Hamburg
 
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
Nooku, Molajo & Co - Joomla! Distributionen. Oder Forks.
 
Enterprise JavaBeans und Web Application
Enterprise JavaBeans und Web ApplicationEnterprise JavaBeans und Web Application
Enterprise JavaBeans und Web Application
 
ColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep DiveColdFusion im Enterprise Umfeld - Deep Dive
ColdFusion im Enterprise Umfeld - Deep Dive
 
2FA4WP - Two Factor Authentification for WordPress
2FA4WP - Two Factor Authentification for WordPress2FA4WP - Two Factor Authentification for WordPress
2FA4WP - Two Factor Authentification for WordPress
 
Net@night asp.net mvc
Net@night asp.net mvcNet@night asp.net mvc
Net@night asp.net mvc
 
Einführung in HTTP/2
Einführung in HTTP/2 Einführung in HTTP/2
Einführung in HTTP/2
 
SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?
 
20131028 named braches
20131028 named braches20131028 named braches
20131028 named braches
 
Umzug in die Cloud - flexible, dynamische Websites und Digital Marketing am B...
Umzug in die Cloud - flexible, dynamische Websites und Digital Marketing am B...Umzug in die Cloud - flexible, dynamische Websites und Digital Marketing am B...
Umzug in die Cloud - flexible, dynamische Websites und Digital Marketing am B...
 
Ms community.cloud express-route
Ms community.cloud express-routeMs community.cloud express-route
Ms community.cloud express-route
 

Andere mochten auch

Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?
Christian Baranowski
 

Andere mochten auch (9)

CQRS basierte Architekturen mit Microservices
CQRS basierte Architekturen mit MicroservicesCQRS basierte Architekturen mit Microservices
CQRS basierte Architekturen mit Microservices
 
Event Sourcing: Einführung und Best Practices
Event Sourcing: Einführung und Best PracticesEvent Sourcing: Einführung und Best Practices
Event Sourcing: Einführung und Best Practices
 
Wicket Kurzübersicht
Wicket KurzübersichtWicket Kurzübersicht
Wicket Kurzübersicht
 
Continuous Delivery @ FriendScout24 | Webinale 2012
Continuous Delivery @ FriendScout24 | Webinale 2012Continuous Delivery @ FriendScout24 | Webinale 2012
Continuous Delivery @ FriendScout24 | Webinale 2012
 
Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?Microservices – die Architektur für Agile-Entwicklung?
Microservices – die Architektur für Agile-Entwicklung?
 
Event Sourcing für reaktive Anwendungen
Event Sourcing für reaktive AnwendungenEvent Sourcing für reaktive Anwendungen
Event Sourcing für reaktive Anwendungen
 
Bessere Präsentationen
Bessere PräsentationenBessere Präsentationen
Bessere Präsentationen
 
Anatomie von Microservice Landschaften
Anatomie von Microservice LandschaftenAnatomie von Microservice Landschaften
Anatomie von Microservice Landschaften
 
Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework? Warum empfehle ich meinen Kunden das Spring Framework?
Warum empfehle ich meinen Kunden das Spring Framework?
 

Ähnlich wie CQRS in der Praxis - Newsletter Double-Opt-In

Creasoft Akademie - Deep dive into ASP.NET MVC
Creasoft Akademie - Deep dive into ASP.NET MVCCreasoft Akademie - Deep dive into ASP.NET MVC
Creasoft Akademie - Deep dive into ASP.NET MVC
Creasoft AG
 
Creasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVCCreasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft AG
 

Ähnlich wie CQRS in der Praxis - Newsletter Double-Opt-In (20)

ASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine EinführungASP.NET MVC 2 - Eine Einführung
ASP.NET MVC 2 - Eine Einführung
 
Creasoft Akademie - Deep dive into ASP.NET MVC
Creasoft Akademie - Deep dive into ASP.NET MVCCreasoft Akademie - Deep dive into ASP.NET MVC
Creasoft Akademie - Deep dive into ASP.NET MVC
 
Creasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVCCreasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVC
 
Die Flux Application Architecture - Facebooks Ansatz für Client-side Web Appl...
Die Flux Application Architecture - Facebooks Ansatz für Client-side Web Appl...Die Flux Application Architecture - Facebooks Ansatz für Client-side Web Appl...
Die Flux Application Architecture - Facebooks Ansatz für Client-side Web Appl...
 
2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc
 
Heisec 2008 web 2.0
Heisec 2008 web 2.0Heisec 2008 web 2.0
Heisec 2008 web 2.0
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Storage Spaces Direct - Introduction
Storage Spaces Direct - IntroductionStorage Spaces Direct - Introduction
Storage Spaces Direct - Introduction
 
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
HTML5-Performance: So rennt Ihre App und nicht Ihre Anwender (weg)
 
Ein Blick in die Zukunft von in-STEP RED und objectiF RM
Ein Blick in die Zukunft von in-STEP RED und objectiF RMEin Blick in die Zukunft von in-STEP RED und objectiF RM
Ein Blick in die Zukunft von in-STEP RED und objectiF RM
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Moderne Business Apps mit XAML - oder mit WPF für die Zukunft geplant
Moderne Business Apps mit XAML - oder mit WPF für die Zukunft geplantModerne Business Apps mit XAML - oder mit WPF für die Zukunft geplant
Moderne Business Apps mit XAML - oder mit WPF für die Zukunft geplant
 
FMK2015: FileMaker 14 Webdirect by Michael Valentin
FMK2015: FileMaker 14 Webdirect by Michael ValentinFMK2015: FileMaker 14 Webdirect by Michael Valentin
FMK2015: FileMaker 14 Webdirect by Michael Valentin
 
Evaluierung einer Hybris-Anbindung an Sitecore mittels Commerce Connect
Evaluierung einer Hybris-Anbindung an Sitecore mittels Commerce ConnectEvaluierung einer Hybris-Anbindung an Sitecore mittels Commerce Connect
Evaluierung einer Hybris-Anbindung an Sitecore mittels Commerce Connect
 
Ringvorlesung: FIO Systems AG stellt Projektziel zum Thema Software Design Pa...
Ringvorlesung: FIO Systems AG stellt Projektziel zum Thema Software Design Pa...Ringvorlesung: FIO Systems AG stellt Projektziel zum Thema Software Design Pa...
Ringvorlesung: FIO Systems AG stellt Projektziel zum Thema Software Design Pa...
 
Vorstellung von Ember.js
Vorstellung von Ember.jsVorstellung von Ember.js
Vorstellung von Ember.js
 
AdminCamp 14: Make your IBM Connections deployment your own - Customize it!
AdminCamp 14: Make your IBM Connections deployment your own - Customize it!AdminCamp 14: Make your IBM Connections deployment your own - Customize it!
AdminCamp 14: Make your IBM Connections deployment your own - Customize it!
 
Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT
 
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
 
Oracle Private & Public Database-as-a-Service
Oracle Private & Public Database-as-a-ServiceOracle Private & Public Database-as-a-Service
Oracle Private & Public Database-as-a-Service
 

CQRS in der Praxis - Newsletter Double-Opt-In

Hinweis der Redaktion

  1. Vorstellen Holger – CIO FORTUNEGLOBE u. HEAD of FORTUNE SOLUTIONS Vorstellen mich Phpind.de Warum CQRS? Suche nach Alternativen zum MVC nach unzähligen Legacy-Anwendungen mit Zend, Symfony und eigenem MVC-Framework Schmerzen beim Refactoring und dem Versuch andere Ansätze zu verknüpfen Für uns die größte Annäherung an das HTTP-Protokoll und die beste Art andere Ansätzen wie DDD, EventSourcing oder SOA anzuknüpfen Was zeigen wir? Kritische Betrachtung des MVC-Patterns in Webanwendungen Theoretische Vorstellung CQRS als Alternative Live Coding
  2. 1979 formuliert norweg. Informatiker den Begriff Model-View-Controller Mehr als 40 Jahre alt und ursprünglich für Desktopanwendungen
  3. Frage stellen: Wie funktioniert das MVC ursprünglich? Klassischer Anwendungsfall sind Multiple Document-Interface-Applikationen Nutzer kann mehrere Fenster (Views) gleichzeitig öffnen Wenn sich Model ändert, müssen alle Views aktualisiert werden Somit wird Nutzer wiederholtes hin-und herblättern zw. 2 Fenstern erspart Dies passiert über eine Subject-Observer-Beziehung, bei dem alle Objekte schon fest verbunden sind View 1 -> Änderung an Controller -> ändert Zustand des Models -> Views werden aktualisiert
  4. Problem 1: Webanwendungen sind Client-Server-Anwendungen -> Trennung durch Systemgrenze Problem 2: Webanwendungen sind Request-Basiert -> Objektgraph zum Zeitpunkt der Änderung noch gar nicht vorhanden -> Wir müssen erstmal überlegen wie wir die Objekte erzeugen Was passiert nun im Web - Klick
  5. Klick auf Button im Browser HTTP-Request wird an Server gesendet -> Controller soll darauf angemessen reagieren Problem: Welcher Controller überhaupt. -> Was tun wir? – Routing! -> Frameworks machen das über sog. FrontController -> dieser führt erst das Routing durch und ruft dann den Controller auf Klick
  6. Controller muss nun mit einem Model sprechen – aber welches Model? Aus dem Request muss erstmal herausgefunden werden, welches Model geladen werden muss – machen die Controller Im klass. MVC ist es gar nicht vorgesehen entscheiden zu müssen, welches Model geladen werden muss Im Web muss der Controller aber diese Verantwortung übernehmen -> fraglich ob es sinnvoll ist die Verantwortlichkeit hineinzudichten Klick
  7. Nun müsste Model Views über Änderung informieren Auf Server existieren die Views nur als HTML String Erst beim Rendern im Client bekommen sie echtes Verhalten View bekommt nun eine andere Bedeutung – statt von einem GUI-Element sprechen wir nun von ganzen HTML-Seiten Und Client kann nur Daten per HTTP abrufen -> Subject-Observer-Muster kann nicht sinnvoll umgesetzt werden Klick
  8. Also was tun wir? Wir informieren den Controller über die Zustandsänderung Controller soll nun entscheiden welche View dargestellt werden soll, obwohl man das gar nicht immer genau wissen kann POST vs. GET und darf User eine Seite überhaupt sehen, ohne eingeloggt zu sein (Redirect auf Loginseite) Ergebnis: Controller hat plötzlich 2 Aufgaben: 1 soll „Kommando“ an die Applikation verarbeiten und 2 er soll entscheiden welche View anzuzeigen ist Verstoss gegen Single-Responsibility-Konzept!
  9. Probleme zusammenfassen Trennung durch Systemgrenze – wegen Client-Server-Architektur Kommunikation Requestbasiert durch HTTP Subject-Observer-Beziehung kann nicht sinnvoll umgesetzt werden, da Model nicht mit View kommunizieren kann Verstoss gegen Single-Responsibility-Prinzip, da Controller mehr als 1 Aufgabe hat Controller verantwortlich für das Laden des Models Fragen bis hier hin? 4 Probleme bewerten Systemgrenze können wir nicht ändern
  10. HTTP-Request können wir auch nicht ändern Aber wir können ihn in den Mittelpunkt rücken
  11. Subject-Observer entfällt
  12. Bleibt noch Single-Responsibility Zentrales Prinzip für das Design wartbarer Software Irgendjemand muss die Models kennen, aber muss es der Controller sein Somit rücken der HTTP-Request und das Single-Responsibility Prinzip in den Fokus Schauen wir uns das genauer an
  13. GET-Request beim Seitenaufruf bspw. durch Linkklick GET-Request ist ein reiner Lesezugriff
  14. Sagen wir GET-Request wird an einen Read Controller delegiert Read Controller lädt Model und fragt Daten ab, rendert View
  15. POST-Requests beim Absenden von Formularen POST-Requests sind Schreibzugriffe und ändern den Zustand einer Applikation Problem: Zustand des Models wurde geändert Controller darf nur schreiben – was nun?
  16. Senden Redirect auf den entsprechenden Read-Controller Redirect ist eine gültige HTTP-Response in der ein Location Header gesendet wird Client wird angewiesen einen neuen GET-Request zu senden Was haben wir gewonnen?
  17. Wir behandeln die unterschiedlichen HTTP-Requests getrennt HTT-Protokoll wird besser abgebildet
  18. Was war jetzt mit Single-Responsibility? Schauen wir uns den Controller nochmal an
  19. Aufgaben des Controllers -Kommando entgegennehmen - Model laden - Entscheiden welche View gerendert wird Kommando behandeln bleibt die zentrale Aufgabe Entscheidung View entfällt, da immer nur 1 möglich Bleibt als 2. Aufgabe das Laden des Models Was wäre wenn wir diese Aufgabe delegieren?
  20. Schalten wir nach vor den Controller einen Handler der den Request verarbeitet Der Handler delegiert nun das Laden des Models jetzt an den Controller Somit hat der Controller nur noch 1 Aufgabe
  21. Super alle Probleme gelöst Schauen wir uns unsere Lösung aber nochmal an
  22. Wenn wir sagen, dass GET-Request Lesebefehle also Queries sind Und das POST-Requests Schreibbefehle, also Commands sind Und wir das in unsere Benamung übernehmen, dann - Klick
  23. Bekommen wir CQRS Command Query Responsibilty Segregation Also Trennung zwischen Lese- und Schreibzugriffen Außerdem Trennung zwischen Applikations- und Anzeigelogik zu trennen man sihet hier auch, wie man CQRS auch in bestehende MVC Anwendungen integrieren kann Indem man die Lese und Schreibzugriffe trennt und dem Controller „falsche“ Aufgaben nimmt Wie nun die Applikationslogik und die Businesslogik implementiert werden beantwortet CQRS nicht Gängige MVC-Frameworks tun das auch nicht Aber wie es in der Praxis aussehen kann und warum man mit CQRS vieles geschenkt bekommt zeigt euch Holger im - Klick
  24. Artikel von Martin Fowler und Stefan Priebsch sehr ans Herz gelegt
  25. RequestHandler werden vom Framework dynamisch aufgerufen Query / Command schaffen konkretes Interface für die Request-Daten Services kapseln die Business-Logik und sprechen mit dem Model / Query-/Command Handler verarbeiten die Ergebnisse der Service-Aufrufe zu einer Antwort Services sind komplett austauschbar ohne das Request / Response Handling anfassen zu müssen!
  26. Artikel von Martin Fowler und Stefan Priebsch sehr ans Herz gelegt
  27. Wer schonmal anfangen will – IceHawk Framework
  28. Vielen Dank Slides auf unserem Blog phpind.de und auf slideshare Verlinkung auch auf der UG-Seite Beispiel-Code auf GitHub