domain driven design e cqrs
DESCRIPTION
I principi del Domain Driven Design applicati attraverso l'architettura CQRS.TRANSCRIPT
![Page 1: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/1.jpg)
Giovedì, 21 giugno 2012
Speaker: Manuel Scapolan
![Page 2: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/2.jpg)
Domain Driven Design
E’ un insieme di principi che ci aiutano a non fallire nel processo di sviluppo di un software *
* considerando tutte le fasi del ciclo di vita!
![Page 3: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/3.jpg)
Alcuni dei più grandi fallimenti della storia:
Sources: Business Week, CEO Magazine, Computerworld, InfoWeek, Fortune, The New York Times, Time, and The Wall Street Journal.
![Page 4: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/4.jpg)
DDD What?
![Page 5: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/5.jpg)
![Page 6: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/6.jpg)
Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …
![Page 7: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/7.jpg)
E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …
![Page 8: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/8.jpg)
E’ importante conoscere e utilizzare lo stesso vocabolario degli esperti di dominio (domain experts) per poterlo poi condividere a tutti i livelli, fino al codice!
Ubiquitous Language
![Page 9: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/9.jpg)
Parlare tutti lo stesso
linguaggio dall’esperto di
dominio, all’analista fino
allo sviluppatore, significa
portare nel codice i
termini comunemente
utilizzati dal business.
Vuol dire che devo scrivere
il codice in italiano???
In nome dell’Ubiquitous
Language può essere
necessario …
![Page 10: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/10.jpg)
La conoscenza deve essere tradotta in un modello concettuale il più possibile fedele alla realtà da rappresentare secondo lo scopo dell’applicazione che ne deve fare uso
Domain Model
![Page 11: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/11.jpg)
“An object model of the domain that incorporates both behavior and data”
Domain Model Pattern
Martin Fowler PoEAA
![Page 12: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/12.jpg)
Mi stai forse dicendo che
fare Domain-Driven
Design significa realizzare
un modello ad oggetti che
rifletta la realtà che
l’applicazione dovrà
gestire?
Non lo facevamo già
questo con l’OOP?
Ci sono forse delle
indicazioni su come devo
disegnare le mie classi?
![Page 13: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/13.jpg)
Model-Driven Design - Building Blocks
2004 - Eric Evans
![Page 14: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/14.jpg)
public class Order : IEquatable<Order> { public bool Equals(Order other) { return this.Id.Equals(other.Id); } }
Entities
Elementi del dominio identificati in modo univoco indipendentemente dai valori dei loro attributi che possono variare nel tempo
![Page 15: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/15.jpg)
Elementi del dominio identificati attraverso l’insieme dei loro attributi, generalmente immutabili, l’unico cambiamento è dato dalla completa sostituzione (no side-effect)
Value Objects
public class ShippingAddress : IEquatable< ShippingAddress > { public bool Equals(ShippingAddress other) { return this.Street.Equals(other. Street) && this.PostCode.Equals(other.PostCode) && this.City.Equals(other.City); } }
![Page 16: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/16.jpg)
Aggregates Garantiscono al loro interno la consistenza delle informazioni
![Page 17: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/17.jpg)
L’aggregato segue alla
perfezione la regola
dell’incapsulamento in
quanto le entità e i value
object che lo compongono
non possono essere
acceduti direttamente, ma
devono essere manipolati
attraverso l’entità definita
come aggregate root.
Ma allora come faccio
l’accesso ai dati?
![Page 18: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/18.jpg)
“Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.”
Repository Pattern
![Page 19: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/19.jpg)
Architettura N-Tier
![Page 20: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/20.jpg)
Diapositiva lasciata intenzionalmente bianca
20
![Page 21: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/21.jpg)
21
Informazioni generali sul
prodotto
Informazioni statistiche
sui prodotti correlati
![Page 22: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/22.jpg)
“A single model cannot be appropriate for reporting, searching, and transactional behaviors…”
Greg Young
![Page 23: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/23.jpg)
23
Informazioni statistiche
aggiornate periodicamente
![Page 24: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/24.jpg)
Per le informazioni in sola lettura (come ad esempio quelle statistiche) possiamo usare un modello costruito appositamente per velocizzare ricerche, query e filtri
Read Model
Ad esempio tra le classi di questo modello potrei avere BestSellerProductItem e BestSellerProductView
![Page 25: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/25.jpg)
Read Model
Domain Model
![Page 26: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/26.jpg)
Ma “two is meglio che one”!
![Page 27: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/27.jpg)
Read Model
Domain Model
![Page 28: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/28.jpg)
“Every method should either be a command that performs an action, or a query that returns data to the caller, but not both.”
Command-query separation (CQS) principle, Bertrand Meyer
![Page 29: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/29.jpg)
Domain Model
Il Domain Model conserva e gestisce la logica di business con tutte le sue regole. Se pensiamo alle modifiche da applicare al modello sono sempre il frutto di una particolare richiesta o task. Ogni richiesta può essere benissimo tradotta nell’esecuzione di un comando ben preciso.
![Page 30: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/30.jpg)
Una comune form di “data-entry”
![Page 31: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/31.jpg)
Una versione Task-based
![Page 32: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/32.jpg)
Ma come aggiorniamo la parte in sola lettura?
![Page 33: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/33.jpg)
Ci vuole qualcosa che ci avvisi che il modello è cambiato …
![Page 34: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/34.jpg)
… qualcosa come un Evento!
![Page 35: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/35.jpg)
Read Model
Nella parte dedicata al Read Model una serie di event handlers catturano gli eventi del Domain Model invocando dei componenti chiamati “Denormalizer” che scompongono le informazioni trasmesse dall’evento e le utilizzano per aggiornare il database dedicato alla lettura.
![Page 36: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/36.jpg)
… e come fa l’evento a raggiungere il suo handler?
![Page 37: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/37.jpg)
… prende il Bus!
Message Bus
![Page 38: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/38.jpg)
![Page 39: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/39.jpg)
DEMO Vediamo un esempio di architettura CQRS
![Page 40: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/40.jpg)
Se facciamo in modo che nell’evento ci sia la logica di applicazione delle modifiche possiamo pensare di salvare gli eventi e avere così un sistema che mi permetta di ricostruire lo stato di un aggregato a partire da una serie di eventi
Event Sourcing
![Page 41: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/41.jpg)
![Page 42: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/42.jpg)
Credits
Slide 1: http://www.flickr.com/photos/26429107@N03/2508680764/
Slide 12: http://www.flickr.com/photos/14456988@N00/5730592664
Slide 17: http://www.flickr.com/photos/39384443@N00/3278857246/
Le immagini contenute in questa presentazione delle quali non è stata esplicitata la provenienza hanno licenza Creative Commons
![Page 43: Domain Driven Design e CQRS](https://reader033.vdocuments.net/reader033/viewer/2022050815/5484aa60b4af9fb55d8b4775/html5/thumbnails/43.jpg)
Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: [email protected]