Domain Driven Design e CQRS

4,232 views
4,202 views

Published on

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

Published in: Technology

Domain Driven Design e CQRS

  1. 1. Giovedì, 21 giugno 2012Speaker: Manuel Scapolan
  2. 2. Domain DrivenDesignE’ un insieme di principi che ciaiutano a non fallire nel processodi sviluppo di un software * * considerando tutte le fasi del ciclo di vita!
  3. 3. Alcuni dei più grandifallimenti della storia:Sources: Business Week, CEO Magazine,Computerworld, InfoWeek, Fortune, TheNew York Times, Time, and The WallStreet Journal.
  4. 4. DDD What?
  5. 5. Una delle principalicause del fallimento diun software è la scarsacomunicazione congli stakeholder …
  6. 6. E’ necessario anticipare il momento incui cominciamo a capirci qualcosa …
  7. 7. Ubiquitous LanguageE’ importante conoscere e utilizzare lostesso vocabolario degli esperti didominio (domain experts) per poterlopoi condividere a tutti i livelli,fino al codice!
  8. 8. Parlare tutti lo stessolinguaggio dall’esperto didominio, all’analista finoallo sviluppatore, significaportare nel codice itermini comunementeutilizzati dal business.Vuol dire che devo scrivereil codice in italiano???In nome dell’UbiquitousLanguage può esserenecessario …
  9. 9. Domain ModelLa conoscenza deve essere tradotta inun modello concettuale il più possibilefedele alla realtà da rappresentaresecondo lo scopo dell’applicazione chene deve fare uso
  10. 10. Domain Model Pattern“An object model of the domain thatincorporates both behavior and data” Martin Fowler PoEAA
  11. 11. Mi stai forse dicendo chefare Domain-DrivenDesign significa realizzareun modello ad oggetti cherifletta la realtà chel’applicazione dovràgestire?Non lo facevamo giàquesto con l’OOP?Ci sono forse delleindicazioni su come devodisegnare le mie classi?
  12. 12. Model-Driven Design - Building Blocks 2004 - Eric Evans
  13. 13. EntitiesElementi del dominio identificati in modounivoco indipendentemente dai valori dei loroattributi che possono variare nel tempopublic class Order : IEquatable<Order>{ public bool Equals(Order other) { return this.Id.Equals(other.Id); }}
  14. 14. Value ObjectsElementi del dominio identificati attraversol’insieme dei loro attributi, generalmenteimmutabili, l’unico cambiamento è dato dallacompleta 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); }}
  15. 15. Garantiscono al loro interno la consistenzaAggregates delle informazioni
  16. 16. L’aggregato segue allaperfezione la regoladell’incapsulamento inquanto le entità e i valueobject che lo compongononon possono essereacceduti direttamente, madevono essere manipolatiattraverso l’entità definitacome aggregate root.Ma allora come facciol’accesso ai dati?
  17. 17. Repository Pattern“Mediates between the domain and datamapping layers using a collection-like interfacefor accessing domain objects.”
  18. 18. Architettura N-Tier
  19. 19. Diapositiva lasciata intenzionalmente bianca 20
  20. 20. Informazioni generali sulprodottoInformazioni statistichesui prodotti correlati 21
  21. 21. “A single model cannot be appropriate forreporting, searching, and transactionalbehaviors…” Greg Young
  22. 22. Informazioni statisticheaggiornate periodicamente 23
  23. 23. Read ModelPer le informazioni in sola lettura(come ad esempio quelle statistiche)possiamo usare un modello costruitoappositamente per velocizzarericerche, query e filtriAd esempio tra le classi di questo modello potrei avereBestSellerProductItem e BestSellerProductView
  24. 24. Domain Model Read Model
  25. 25. Ma “two is meglio che one”!
  26. 26. Domain Model Read Model
  27. 27. “Every method should either be acommand that performs an action, or aquery that returns data to the caller, butnot both.” Command-query separation (CQS) principle, Bertrand Meyer
  28. 28. 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 particolareDomain Model richiesta o task. Ogni richiesta può essere benissimo tradotta nell’esecuzione di un comando ben preciso.
  29. 29. Una comune form di “data-entry”
  30. 30. Una versione Task-based
  31. 31. Ma come aggiorniamo la parte insola lettura?
  32. 32. Ci vuole qualcosa che ci avvisi che ilmodello è cambiato …
  33. 33. … qualcosa come un Evento!
  34. 34. Nella parte dedicata alRead Model una serie dievent handlers catturanogli eventi del DomainModel invocando deicomponenti chiamati“Denormalizer” chescompongono leinformazioni trasmessedall’evento e le utilizzanoper aggiornare il database Read Modeldedicato alla lettura.
  35. 35. … e come fa l’evento a raggiungere ilsuo handler?
  36. 36. … prende il Bus! Message Bus
  37. 37. DEMOVediamo un esempio di architettura CQRS
  38. 38. Event SourcingSe facciamo in modo che nell’evento ci siala logica di applicazione delle modifichepossiamo pensare di salvare gli eventi eavere così un sistema che mi permetta diricostruire lo stato di un aggregato apartire da una serie di eventi
  39. 39. CreditsLe immagini contenute in questa presentazione dellequali non è stata esplicitata la provenienza hannolicenza Creative CommonsSlide 1: http://www.flickr.com/photos/26429107@N03/2508680764/Slide 12: http://www.flickr.com/photos/14456988@N00/5730592664Slide 17: http://www.flickr.com/photos/39384443@N00/3278857246/
  40. 40. Thank You MANUEL SCAPOLAN website: www.manuelscapolan.it twitter: manuelscapolan e-mail: info@manuelscapolan.it

×