2. A venir dans vos communautés…
23/10 : Tests avec TFS
04/11 : CARA Lyon
15/11 : Global Day of CodeRetreat, journée entière le samedi
18/11 : Human Talks
25/11 : Coding Dojo => sujet à discuter sur
https://groups.google.com/forum/#!forum/cara-dojo, approches des
différents frameworks ? (xSpec, Gherkin, xxxUnit)
Et encore plus sur http://lyontechhub.org
3. Le sujet du jour…
Suite à la session de Jérémie Chassaing (@thinkb4coding) au MUGLyon,
mettons en pratique l’Event Sourcing sur le jeu du Uno.
Quelques règles de bases du Uno :
• Démarrer une partie avec au moins 3 joueurs
• Jouer une carte à son tour (même couleur ou même numéro)
• Pour aller plus loin : gérer les cartes spéciales (changement de
sens…), gérer les malus en cas d’erreur (Event plutôt qu’exception)
4. Quelques clés de l’EventSourcing
Conserver la succession d’événements métier PLUTÔT QUE l’état actuel du système
• /! Command Sourcing
Définir des événements métier (Event) autour d’AggregateRoot générés à partir de
Command (atelier EventStorming, 6 code smells) => lien avec le DDD
Reconstruire l’état actuel à partir de la suite d’événements passés
Lien avec CQRS (Command Query Responsability Seggregation): on n’utilise pas
forcément le modèle à base d’EventSourcing pour les opérations de lecture (Query)
=> opérations de projection des événements dans un modèle de lecture spécifique
5. Un schéma plutôt que des mots…
« Decide » Command Events
« Apply »
EventStore
State
Event Sourcing
CQRS
« Project »
SGBD
Query Base NoSQL
6. A vous de jouer…
1. AggregateRoot Game, Command StartGame, Event GameStarted =>
« fonction Decide » + EventStore (stockage en mémoire)
> Comment passer les événements de l’AggregateRoot à l’EventStore,
sachant que ce n’est qu’un écouteur parmi d’autres des Events levés ?
> Pistes : AggregateRoots.GetEvents, DomainEvent.Raise, autres ?
2. Command PlayCard, Event CardPlayed + exceptions =>
« fonction Apply »
3. Chargement d’un Aggregat à partir des événements
4. Gestion de la concurrence, de cas plus complexes (cartes spéciales,
Event au lieu d’exceptions…), changement de support de stockage
(GetEventStore…)
8. Quelques références
En C# : https://github.com/gregoryyoung/m-r,
En F# : https://github.com/thinkbeforecoding/FsUno,
http://thinkbeforecoding.github.io/FsUno.Prod/
En PHP : https://github.com/beberlei/litecqrs-php,
https://github.com/qandidate-labs/broadway
En Java : http://www.jayway.com/2013/03/08/aggregates-event-sourcing-
distilled/ ?
En Ruby : https://github.com/slashdotdash/rcqrs ?
En Scala : https://github.com/eligosource/eventsourced-example ?