Domain Driven Design e CQRS
-
Upload
manuel-scapolan -
Category
Technology
-
view
3.462 -
download
0
description
Transcript of Domain Driven Design e CQRS
Giovedì, 21 giugno 2012
Speaker: Manuel Scapolan
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!
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.
DDD What?
Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …
E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …
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
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 …
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
“An object model of the domain that incorporates both behavior and data”
Domain Model Pattern
Martin Fowler PoEAA
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?
Model-Driven Design - Building Blocks
2004 - Eric Evans
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
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); } }
Aggregates Garantiscono al loro interno la consistenza delle informazioni
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?
“Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.”
Repository Pattern
Architettura N-Tier
Diapositiva lasciata intenzionalmente bianca
20
21
Informazioni generali sul
prodotto
Informazioni statistiche
sui prodotti correlati
“A single model cannot be appropriate for reporting, searching, and transactional behaviors…”
Greg Young
23
Informazioni statistiche
aggiornate periodicamente
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
Read Model
Domain Model
Ma “two is meglio che one”!
Read Model
Domain Model
“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
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.
Una comune form di “data-entry”
Una versione Task-based
Ma come aggiorniamo la parte in sola lettura?
Ci vuole qualcosa che ci avvisi che il modello è cambiato …
… qualcosa come un Evento!
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.
… e come fa l’evento a raggiungere il suo handler?
… prende il Bus!
Message Bus
DEMO Vediamo un esempio di architettura CQRS
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
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
Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: [email protected]