SlideShare ist ein Scribd-Unternehmen logo
1 von 43
Downloaden Sie, um offline zu lesen
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 …
Ubiquitous Language
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!
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 …
Domain Model
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 Pattern
“An object model of the domain that
incorporates both behavior and data”
                             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
Entities
Elementi del dominio identificati in modo
univoco indipendentemente dai valori dei loro
attributi che possono variare nel tempo

public class Order : IEquatable<Order>
{
  public bool Equals(Order other)
  {
     return this.Id.Equals(other.Id);
  }
}
Value Objects
Elementi del dominio identificati attraverso
l’insieme dei loro attributi, generalmente
immutabili, l’unico cambiamento è dato dalla
completa sostituzione (no side-effect)

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);
  }
}
Garantiscono al loro
             interno la consistenza
Aggregates   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?
Repository Pattern
“Mediates between the domain and data
mapping layers using a collection-like interface
for accessing domain objects.”
Architettura N-Tier
Diapositiva lasciata intenzionalmente bianca




                                               20
Informazioni generali sul
prodotto




Informazioni statistiche
sui prodotti correlati




                            21
“A single model cannot be appropriate for
reporting, searching, and transactional
behaviors…”
                                 Greg Young
Informazioni statistiche
aggiornate periodicamente




                            23
Read Model
Per le informazioni in sola lettura
(come ad esempio quelle statistiche)
possiamo usare un modello costruito
appositamente per velocizzare
ricerche, query e filtri
Ad esempio tra le classi di questo modello potrei avere
BestSellerProductItem e BestSellerProductView
Domain Model




               Read Model
Ma “two is meglio che one”!
Domain Model




               Read 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
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
Domain Model   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!
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    Read Model
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
Event Sourcing
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
Credits
Le immagini contenute in questa presentazione delle
quali non è stata esplicitata la provenienza hanno
licenza Creative Commons

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/
Thank You   MANUEL SCAPOLAN
            website: www.manuelscapolan.it
            twitter: manuelscapolan
            e-mail: info@manuelscapolan.it

Weitere ähnliche Inhalte

Was ist angesagt?

Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven DesignAndriy Buday
 
CQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility SegregationCQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility SegregationBrian Ritchie
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledNicola Costantino
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing ArchitecturesVictor Rentea
 
Serverless Kafka on AWS as Part of a Cloud-native Data Lake Architecture
Serverless Kafka on AWS as Part of a Cloud-native Data Lake ArchitectureServerless Kafka on AWS as Part of a Cloud-native Data Lake Architecture
Serverless Kafka on AWS as Part of a Cloud-native Data Lake ArchitectureKai Wähner
 
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...Chris Richardson
 
ECS and Docker at Okta
ECS and Docker at OktaECS and Docker at Okta
ECS and Docker at OktaJon Todd
 
Modelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignModelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignNaeem Sarfraz
 
Domain-driven design - eine Einführung
Domain-driven design - eine EinführungDomain-driven design - eine Einführung
Domain-driven design - eine Einführungdie.agilen GmbH
 
Mucon 2019: OOps I DDD it again and again
Mucon 2019: OOps I DDD it again and againMucon 2019: OOps I DDD it again and again
Mucon 2019: OOps I DDD it again and againOra Egozi-Barzilai
 
Domain driven design and model driven development
Domain driven design and model driven developmentDomain driven design and model driven development
Domain driven design and model driven developmentDmitry Geyzersky
 
A Product Manager's Place in a DevOps World
A Product Manager's Place in a DevOps WorldA Product Manager's Place in a DevOps World
A Product Manager's Place in a DevOps WorldAtlassian
 
Clean architecture
Clean architectureClean architecture
Clean architectureandbed
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Alan Christensen
 
Domain Driven Design: Zero to Hero
Domain Driven Design: Zero to HeroDomain Driven Design: Zero to Hero
Domain Driven Design: Zero to HeroFabrício Rissetto
 
The microservice architecture: what, why, when and how?
The microservice architecture: what, why, when and how?The microservice architecture: what, why, when and how?
The microservice architecture: what, why, when and how?Chris Richardson
 

Was ist angesagt? (20)

Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
CQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility SegregationCQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility Segregation
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) Distilled
 
Vertical Slicing Architectures
Vertical Slicing ArchitecturesVertical Slicing Architectures
Vertical Slicing Architectures
 
Event storming
Event storming Event storming
Event storming
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Serverless Kafka on AWS as Part of a Cloud-native Data Lake Architecture
Serverless Kafka on AWS as Part of a Cloud-native Data Lake ArchitectureServerless Kafka on AWS as Part of a Cloud-native Data Lake Architecture
Serverless Kafka on AWS as Part of a Cloud-native Data Lake Architecture
 
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
 
ECS and Docker at Okta
ECS and Docker at OktaECS and Docker at Okta
ECS and Docker at Okta
 
Modelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven DesignModelling a complex domain with Domain-Driven Design
Modelling a complex domain with Domain-Driven Design
 
Domain-driven design - eine Einführung
Domain-driven design - eine EinführungDomain-driven design - eine Einführung
Domain-driven design - eine Einführung
 
Mucon 2019: OOps I DDD it again and again
Mucon 2019: OOps I DDD it again and againMucon 2019: OOps I DDD it again and again
Mucon 2019: OOps I DDD it again and again
 
Domain driven design and model driven development
Domain driven design and model driven developmentDomain driven design and model driven development
Domain driven design and model driven development
 
A Product Manager's Place in a DevOps World
A Product Manager's Place in a DevOps WorldA Product Manager's Place in a DevOps World
A Product Manager's Place in a DevOps World
 
Cloud Adoption
Cloud AdoptionCloud Adoption
Cloud Adoption
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Domain Driven Design: Zero to Hero
Domain Driven Design: Zero to HeroDomain Driven Design: Zero to Hero
Domain Driven Design: Zero to Hero
 
The microservice architecture: what, why, when and how?
The microservice architecture: what, why, when and how?The microservice architecture: what, why, when and how?
The microservice architecture: what, why, when and how?
 

Andere mochten auch

Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Manuel Scapolan
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreManuel Scapolan
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Manuel Scapolan
 
Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Manuel Scapolan
 
TFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedManuel Scapolan
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSAndrea Saltarello
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...Andrea Balducci
 
C# e la Framework Class Library
C# e la Framework Class LibraryC# e la Framework Class Library
C# e la Framework Class LibraryManuel Scapolan
 
Dai delegati a LINQ con C#
Dai delegati a LINQ con C#Dai delegati a LINQ con C#
Dai delegati a LINQ con C#Manuel Scapolan
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
Stai guardando i dati sbagliati
Stai guardando i dati sbagliatiStai guardando i dati sbagliati
Stai guardando i dati sbagliatiAlberto Brandolini
 
Costruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeCostruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeFederico Venturini
 

Andere mochten auch (20)

NOSQL
NOSQLNOSQL
NOSQL
 
Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!Scrum? E' come fare il bucato!
Scrum? E' come fare il bucato!
 
Knockout.js
Knockout.jsKnockout.js
Knockout.js
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatore
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)
 
Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3Tutte le novità di ASP.NET MVC3
Tutte le novità di ASP.NET MVC3
 
TFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons Learned
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Transactions redefined
Transactions redefinedTransactions redefined
Transactions redefined
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
 
C# e la Framework Class Library
C# e la Framework Class LibraryC# e la Framework Class Library
C# e la Framework Class Library
 
Dai delegati a LINQ con C#
Dai delegati a LINQ con C#Dai delegati a LINQ con C#
Dai delegati a LINQ con C#
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Stai guardando i dati sbagliati
Stai guardando i dati sbagliatiStai guardando i dati sbagliati
Stai guardando i dati sbagliati
 
Costruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editorialeCostruire l'identità digitale con il piano editoriale
Costruire l'identità digitale con il piano editoriale
 
Liberate il kraken
Liberate il krakenLiberate il kraken
Liberate il kraken
 
Optimized for what
Optimized for whatOptimized for what
Optimized for what
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
 

Ähnlich wie Domain Driven Design e CQRS

How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignAndrea Saltarello
 
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...Corrado Musumeci
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1massimiliano.wosz
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Massimo Cenci
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Fabio Armani
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLuca Acquaviva
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Machine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsMachine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsIgor Antonacci
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Gian Maria Ricci
 
AreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàAreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàGiulio Destri
 
Un'architettura di riferimento per applicazioni enterprise
Un'architettura di riferimento per applicazioni enterpriseUn'architettura di riferimento per applicazioni enterprise
Un'architettura di riferimento per applicazioni enterpriseAlberto Lagna
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
Abilitare le organizzazioni e le persone ad adottare con successo il Cloud
Abilitare le organizzazioni e le persone ad adottare con successo il CloudAbilitare le organizzazioni e le persone ad adottare con successo il Cloud
Abilitare le organizzazioni e le persone ad adottare con successo il CloudAmazon Web Services
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockoutDotNetCampus
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)Sabino Labarile
 
BDD in DDD
BDD in DDDBDD in DDD
BDD in DDDoehsani
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 

Ähnlich wie Domain Driven Design e CQRS (20)

How I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven DesignHow I did it (in .NET): idiomatic Domain Driven Design
How I did it (in .NET): idiomatic Domain Driven Design
 
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
 
Zend Framework Workshop Parte1
Zend Framework Workshop Parte1Zend Framework Workshop Parte1
Zend Framework Workshop Parte1
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
Note di Data Warehouse e Business Intelligence - Tecniche di Naming Conventio...
 
Kotlin hexagonal-architecture
Kotlin hexagonal-architectureKotlin hexagonal-architecture
Kotlin hexagonal-architecture
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Machine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devopsMachine learning models continuous deployment on azure using devops
Machine learning models continuous deployment on azure using devops
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010
 
AreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicitàAreaMVC: un'architettura software basata sulla semplicità
AreaMVC: un'architettura software basata sulla semplicità
 
Un'architettura di riferimento per applicazioni enterprise
Un'architettura di riferimento per applicazioni enterpriseUn'architettura di riferimento per applicazioni enterprise
Un'architettura di riferimento per applicazioni enterprise
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
Abilitare le organizzazioni e le persone ad adottare con successo il Cloud
Abilitare le organizzazioni e le persone ad adottare con successo il CloudAbilitare le organizzazioni e le persone ad adottare con successo il Cloud
Abilitare le organizzazioni e le persone ad adottare con successo il Cloud
 
Fe02 ria con breeze e knockout
Fe02   ria con breeze e knockoutFe02   ria con breeze e knockout
Fe02 ria con breeze e knockout
 
m-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Netm-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Net
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)
 
BDD in DDD
BDD in DDDBDD in DDD
BDD in DDD
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 

Mehr von Manuel Scapolan

ASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerManuel Scapolan
 
ASP.NET MVC 3 - Trasportare i dati nel Model
ASP.NET MVC 3 - Trasportare i dati nel ModelASP.NET MVC 3 - Trasportare i dati nel Model
ASP.NET MVC 3 - Trasportare i dati nel ModelManuel Scapolan
 
ASP.NET MVC 3 - Presentare i dati nella View
ASP.NET MVC 3 - Presentare i dati nella ViewASP.NET MVC 3 - Presentare i dati nella View
ASP.NET MVC 3 - Presentare i dati nella ViewManuel Scapolan
 

Mehr von Manuel Scapolan (6)

ASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del Controller
 
ASP.NET MVC 3 - Trasportare i dati nel Model
ASP.NET MVC 3 - Trasportare i dati nel ModelASP.NET MVC 3 - Trasportare i dati nel Model
ASP.NET MVC 3 - Trasportare i dati nel Model
 
ASP.NET MVC 3 - Presentare i dati nella View
ASP.NET MVC 3 - Presentare i dati nella ViewASP.NET MVC 3 - Presentare i dati nella View
ASP.NET MVC 3 - Presentare i dati nella View
 
ASP.NET
ASP.NETASP.NET
ASP.NET
 
HTML e CSS
HTML e CSSHTML e CSS
HTML e CSS
 
ASP.NET MVC Intro
ASP.NET MVC IntroASP.NET MVC Intro
ASP.NET MVC Intro
 

Kürzlich hochgeladen

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 

Kürzlich hochgeladen (9)

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 

Domain Driven Design e CQRS

  • 1. Giovedì, 21 giugno 2012 Speaker: Manuel Scapolan
  • 2. 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!
  • 3. 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.
  • 5.
  • 6. Una delle principali cause del fallimento di un software è la scarsa comunicazione con gli stakeholder …
  • 7. E’ necessario anticipare il momento in cui cominciamo a capirci qualcosa …
  • 8. Ubiquitous Language 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!
  • 9. 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 …
  • 10. Domain Model 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
  • 11. Domain Model Pattern “An object model of the domain that incorporates both behavior and data” Martin Fowler PoEAA
  • 12. 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?
  • 13. Model-Driven Design - Building Blocks 2004 - Eric Evans
  • 14. Entities Elementi del dominio identificati in modo univoco indipendentemente dai valori dei loro attributi che possono variare nel tempo public class Order : IEquatable<Order> { public bool Equals(Order other) { return this.Id.Equals(other.Id); } }
  • 15. Value Objects Elementi del dominio identificati attraverso l’insieme dei loro attributi, generalmente immutabili, l’unico cambiamento è dato dalla completa sostituzione (no side-effect) 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); } }
  • 16. Garantiscono al loro interno la consistenza Aggregates delle informazioni
  • 17. 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?
  • 18. Repository Pattern “Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.”
  • 21. Informazioni generali sul prodotto Informazioni statistiche sui prodotti correlati 21
  • 22. “A single model cannot be appropriate for reporting, searching, and transactional behaviors…” Greg Young
  • 24. Read Model Per le informazioni in sola lettura (come ad esempio quelle statistiche) possiamo usare un modello costruito appositamente per velocizzare ricerche, query e filtri Ad esempio tra le classi di questo modello potrei avere BestSellerProductItem e BestSellerProductView
  • 25. Domain Model Read Model
  • 26. Ma “two is meglio che one”!
  • 27. Domain Model Read Model
  • 28. “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
  • 29. 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 Domain Model richiesta o task. Ogni richiesta può essere benissimo tradotta nell’esecuzione di un comando ben preciso.
  • 30. Una comune form di “data-entry”
  • 32. Ma come aggiorniamo la parte in sola lettura?
  • 33. Ci vuole qualcosa che ci avvisi che il modello è cambiato …
  • 34. … qualcosa come un Evento!
  • 35. 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 Read Model dedicato alla lettura.
  • 36. … e come fa l’evento a raggiungere il suo handler?
  • 37. … prende il Bus! Message Bus
  • 38.
  • 39. DEMO Vediamo un esempio di architettura CQRS
  • 40. Event Sourcing 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
  • 41.
  • 42. Credits Le immagini contenute in questa presentazione delle quali non è stata esplicitata la provenienza hanno licenza Creative Commons 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/
  • 43. Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: info@manuelscapolan.it