SlideShare a Scribd company logo
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

More Related Content

What's hot

Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
Lightbend
 
DDD - 2 - Domain Driven Design: Tactical design.pdf
DDD - 2 - Domain Driven Design: Tactical design.pdfDDD - 2 - Domain Driven Design: Tactical design.pdf
DDD - 2 - Domain Driven Design: Tactical design.pdf
Eleonora Ciceri
 
Log management system for Microservices
Log management system for MicroservicesLog management system for Microservices
Log management system for Microservices
Võ Duy Tuấn
 
CQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility SegregationCQRS: Command/Query Responsibility Segregation
CQRS: Command/Query Responsibility Segregation
Brian Ritchie
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계
Hyosung Jeon
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
Hannah Farrugia
 
N-Tier Application Architecture
N-Tier Application ArchitectureN-Tier Application Architecture
N-Tier Application Architecture
Manoj Kumar
 
Architecture Description Languages
Architecture Description LanguagesArchitecture Description Languages
Architecture Description Languages
Henry Muccini
 
Software Architecture vs design
Software Architecture vs design Software Architecture vs design
Software Architecture vs design
Arslan Anwar
 
Technology sailing effects
Technology sailing effectsTechnology sailing effects
Technology sailing effects
Chris Sandström
 
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
Microsoft
 
Hexagonal architecture for java applications
Hexagonal architecture for java applicationsHexagonal architecture for java applications
Hexagonal architecture for java applications
Fabricio Epaminondas
 
Enterprise container platform verrazzano
Enterprise container platform verrazzanoEnterprise container platform verrazzano
Enterprise container platform verrazzano
Michel Schildmeijer
 
Movie Rating Site [for presentation]
Movie Rating Site [for presentation]Movie Rating Site [for presentation]
Movie Rating Site [for presentation]
SH Rajøn
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) Distilled
Nicola Costantino
 
DevOps Torino Meetup - SRE Concepts
DevOps Torino Meetup - SRE ConceptsDevOps Torino Meetup - SRE Concepts
DevOps Torino Meetup - SRE Concepts
Rauno De Pasquale
 
Requirements elicitation
Requirements elicitationRequirements elicitation
Requirements elicitationAbdul Basit
 
Microservices with event source and CQRS
Microservices with event source and CQRSMicroservices with event source and CQRS
Microservices with event source and CQRS
Md Ayub Ali Sarker
 

What's hot (20)

Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
Using the Actor Model with Domain-Driven Design (DDD) in Reactive Systems - w...
 
Bdd
BddBdd
Bdd
 
DDD - 2 - Domain Driven Design: Tactical design.pdf
DDD - 2 - Domain Driven Design: Tactical design.pdfDDD - 2 - Domain Driven Design: Tactical design.pdf
DDD - 2 - Domain Driven Design: Tactical design.pdf
 
Log management system for Microservices
Log management system for MicroservicesLog management system for Microservices
Log management system for Microservices
 
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
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
N-Tier Application Architecture
N-Tier Application ArchitectureN-Tier Application Architecture
N-Tier Application Architecture
 
Architecture Description Languages
Architecture Description LanguagesArchitecture Description Languages
Architecture Description Languages
 
Software Architecture vs design
Software Architecture vs design Software Architecture vs design
Software Architecture vs design
 
Technology sailing effects
Technology sailing effectsTechnology sailing effects
Technology sailing effects
 
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
Patterns (et anti-patterns) d’architecture ou comment mieux concevoir ses app...
 
Hexagonal architecture for java applications
Hexagonal architecture for java applicationsHexagonal architecture for java applications
Hexagonal architecture for java applications
 
Enterprise container platform verrazzano
Enterprise container platform verrazzanoEnterprise container platform verrazzano
Enterprise container platform verrazzano
 
Movie Rating Site [for presentation]
Movie Rating Site [for presentation]Movie Rating Site [for presentation]
Movie Rating Site [for presentation]
 
Domain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) DistilledDomain Driven Design (Ultra) Distilled
Domain Driven Design (Ultra) Distilled
 
DevOps Torino Meetup - SRE Concepts
DevOps Torino Meetup - SRE ConceptsDevOps Torino Meetup - SRE Concepts
DevOps Torino Meetup - SRE Concepts
 
Requirements elicitation
Requirements elicitationRequirements elicitation
Requirements elicitation
 
Microservices with event source and CQRS
Microservices with event source and CQRSMicroservices with event source and CQRS
Microservices with event source and CQRS
 

Viewers also liked

NOSQL
NOSQLNOSQL
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
 
Knockout.js
Knockout.jsKnockout.js
Knockout.js
Manuel Scapolan
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatore
Manuel 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 MVC3
Manuel Scapolan
 
TFS and Scrum - Lessons Learned
TFS and Scrum - Lessons LearnedTFS and Scrum - Lessons Learned
TFS and Scrum - Lessons Learned
Manuel Scapolan
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
Manuel Scapolan
 
Transactions redefined
Transactions redefinedTransactions redefined
Transactions redefined
Alberto Brandolini
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
Andrea 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 Library
Manuel 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 Oriented
Manuel Scapolan
 
JavaScript
JavaScriptJavaScript
JavaScript
Manuel Scapolan
 
Stai guardando i dati sbagliati
Stai guardando i dati sbagliatiStai guardando i dati sbagliati
Stai guardando i dati sbagliati
Alberto 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 editoriale
Federico Venturini
 
Liberate il kraken
Liberate il krakenLiberate il kraken
Liberate il kraken
Alberto Brandolini
 
Optimized for what
Optimized for whatOptimized for what
Optimized for what
Alberto Brandolini
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
Manuel Scapolan
 

Viewers also liked (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#
 

Similar to 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
 
Kotlin hexagonal-architecture
Kotlin hexagonal-architectureKotlin hexagonal-architecture
Kotlin hexagonal-architecture
Alessandro Minoccheri
 
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 miniservizi
Luca 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 devops
Igor Antonacci
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010
Gian 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 Build
Gian 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 Cloud
Amazon 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
 
m-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Netm-v-vm @ UgiAlt.Net
m-v-vm @ UgiAlt.Net
Mauro Servienti
 
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 DDD
oehsani
 
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
Andrea Dottor
 

Similar to 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
 

More from 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 Controller
Manuel 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 Model
Manuel 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 View
Manuel Scapolan
 
ASP.NET
ASP.NETASP.NET
HTML e CSS
HTML e CSSHTML e CSS
HTML e CSS
Manuel Scapolan
 
ASP.NET MVC Intro
ASP.NET MVC IntroASP.NET MVC Intro
ASP.NET MVC Intro
Manuel Scapolan
 

More from 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
 

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