Domain Driven Design e CQRS

Post on 07-Dec-2014

3.458 views 0 download

description

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

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: info@manuelscapolan.it