Domain Driven Design e CQRS

43
Giovedì, 21 giugno 2012 Speaker: Manuel Scapolan

description

I principi del Domain Driven Design applicati attraverso l'architettura CQRS.

Transcript of Domain Driven Design e CQRS

Page 1: Domain Driven Design e CQRS

Giovedì, 21 giugno 2012

Speaker: Manuel Scapolan

Page 2: Domain Driven Design e CQRS

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

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

DDD What?

Page 5: Domain Driven Design e CQRS
Page 6: Domain Driven Design e CQRS

Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …

Page 7: Domain Driven Design e CQRS

E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …

Page 8: Domain Driven Design e CQRS

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

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

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

“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

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

Model-Driven Design - Building Blocks

2004 - Eric Evans

Page 14: Domain Driven Design e CQRS

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

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

Aggregates Garantiscono al loro interno la consistenza delle informazioni

Page 17: Domain Driven Design e CQRS

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

“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

Architettura N-Tier

Page 20: Domain Driven Design e CQRS

Diapositiva lasciata intenzionalmente bianca

20

Page 21: Domain Driven Design e CQRS

21

Informazioni generali sul

prodotto

Informazioni statistiche

sui prodotti correlati

Page 22: Domain Driven Design e CQRS

“A single model cannot be appropriate for reporting, searching, and transactional behaviors…”

Greg Young

Page 23: Domain Driven Design e CQRS

23

Informazioni statistiche

aggiornate periodicamente

Page 24: Domain Driven Design e CQRS

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

Read Model

Domain Model

Page 26: Domain Driven Design e CQRS

Ma “two is meglio che one”!

Page 27: Domain Driven Design e CQRS

Read Model

Domain Model

Page 28: Domain Driven Design e CQRS

“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

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

Una comune form di “data-entry”

Page 31: Domain Driven Design e CQRS

Una versione Task-based

Page 32: Domain Driven Design e CQRS

Ma come aggiorniamo la parte in sola lettura?

Page 33: Domain Driven Design e CQRS

Ci vuole qualcosa che ci avvisi che il modello è cambiato …

Page 34: Domain Driven Design e CQRS

… qualcosa come un Evento!

Page 35: Domain Driven Design e CQRS

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

… e come fa l’evento a raggiungere il suo handler?

Page 37: Domain Driven Design e CQRS

… prende il Bus!

Message Bus

Page 38: Domain Driven Design e CQRS
Page 39: Domain Driven Design e CQRS

DEMO Vediamo un esempio di architettura CQRS

Page 40: Domain Driven Design e 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

Page 41: Domain Driven Design e CQRS
Page 42: Domain Driven Design e CQRS

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

Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: [email protected]