SlideShare a Scribd company logo
An Introduction to

   Command/Query Responsibility
          Segregation

                presented by Dennis Traub
              .NET Stammtisch Konstanz/Kreuzlingen - 20. März 2013




Dennis Traub – Software Development Consultancy            @dtraub – mail@dennistraub.de
Who‘s that guy?

          Dennis Traub
          Founder, Owner, CEO, Single Employee of
          D. Traub Software Development Consultancy




             Consultant, developer, trainer, speaker


             39 years old


             Married, father of one


             20+ years in software development


             Hire me at mail@dennistraub.de




               @dtraub




Dennis Traub – Software Development Consultancy        @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                      Break         Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
The „Blue Book“ by Eric Evans




                                          Image Placeholder




Dennis Traub – Software Development Consultancy               @dtraub – mail@dennistraub.de
Domain-Driven Design

                                                         Domain
                                                         Service
                      Value Object
                                                                   Aggregate
                   Specification             The well-
                                              known
                    Reposit ory              Patterns               Entity


                               Factory                      And so on . .




Dennis Traub – Software Development Consultancy                        @dtraub – mail@dennistraub.de
Domain-Driven Design


                                                    Ubiquit ous Language
                     Core Domain
                                                                Domain Expert
               Bounded Context                 The
                                            important
                 Domain Model                Patterns             (Generic) Subdomains


                        Context Map                          And so on . .




Dennis Traub – Software Development Consultancy                         @dtraub – mail@dennistraub.de
don‘t build one big model
                            that works for everyone




Dennis Traub – Software Development Consultancy      @dtraub – mail@dennistraub.de
the tactical Building Blocks
                                    we don‘t use DDD
                             when there is no     value in
                             formalizing the problem




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
we only use DDD in parts
                            where we get a competitive
                                        advantage




Dennis Traub – Software Development Consultancy     @dtraub – mail@dennistraub.de
we focus our effort and resources on
                the most             important subdomain




Dennis Traub – Software Development Consultancy    @dtraub – mail@dennistraub.de
a.k.a. The             Core Domain




Dennis Traub – Software Development Consultancy             @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
Presentation Layer


                                      Application Services


                            Domain / Business Model / BLL


                                       DAL / O/R-Mapper




Dennis Traub – Software Development Consultancy              @dtraub – mail@dennistraub.de
Pros of the „Best Practice Architecture“



             1    Easy to build


             2    Accepted by management


             3    Well-know throughall all seniority levels


             4    We know ist limitiations




Dennis Traub – Software Development Consultancy               @dtraub – mail@dennistraub.de
Cons of the „Best Practice Architecture“



             1    Limited scalability


             2    Loss of intent


             3    Lazy loading, locking, race conditions, …


             4    Few classes do way too much stuff




Dennis Traub – Software Development Consultancy               @dtraub – mail@dennistraub.de
And:
                      If the model is basically
                                         CRUD
                   where does Business Logic live?




Dennis Traub – Software Development Consultancy          @dtraub – mail@dennistraub.de
Domain Model Responsibilities



             1    Business Logic                  6   Aggregation

             2    Validation                      7   Presentation

             3    Structure                       8   Persistence

             4    Projection                      9   Processes

             5    Associations                    10 Lazy / Eager Loading




Dennis Traub – Software Development Consultancy                      @dtraub – mail@dennistraub.de
the S in SOLID




Dennis Traub – Software Development Consultancy        @dtraub – mail@dennistraub.de
SINGLE RESPONSIBILITY PRINCIPLE
             Just because you can doesn‘t mean you should

Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
why do we try to build
                 One Model to Rule Them All?




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
reading and writing are
              completely different from eachother




Dennis Traub – Software Development Consultancy             @dtraub – mail@dennistraub.de
Sometimes it‘s cheaper to do two things
                       than dealing with the trade-offs




Dennis Traub – Software Development Consultancy      @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
Command Query Separation




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Command Query Separation (CQS)




                        „Every method should either be
        a command that       performs an action or
             a query that returns data to the caller“

                                                  -- Dr. Bertrand Meyer




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Command Query Separation (CQS)




                                         in other words:
                            Asking a question should
                            not change the answer




Dennis Traub – Software Development Consultancy            @dtraub – mail@dennistraub.de
Command/Query
                   Responsability Segregation




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
CQS on an Architectural Level



                          Queries                                  Commands




         Project Details               Project List                 Project




                                                      Data Store


Dennis Traub – Software Development Consultancy                    @dtraub – mail@dennistraub.de
Queries and Projection (Read)


                                            Show something




                                            Thin Read Layer



                                                  Data Store

Dennis Traub – Software Development Consultancy                @dtraub – mail@dennistraub.de
Thin Read Layer



             Concerns:

             1    Filtering, Scope


             2    Data Presentation




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Thin Read Layer



             Attributes:

             1    Data-Oriented


             2    Indexable

             3    Can be denormalized and distributed for fast access


             4    Only Structure




Dennis Traub – Software Development Consultancy                @dtraub – mail@dennistraub.de
Behavior and Modification (Write)


                                              Do something



                                          Command Handler


                                                  Domain Model


                                                  O/R-Mapper



                                                  Data Store

Dennis Traub – Software Development Consultancy                  @dtraub – mail@dennistraub.de
Domain Model



             Concerns:

             1    Business Logic


             2    Validation




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Domain Model



             Attributes:

             1    Normalized


             2    Transactional

             3    Object-Oriented


             4    Persistence Ignorant


             5    Only Behavior




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Commands



             Refactor Application Service Calls to Objects

             1    Serializable


             2    Can be enveloped

             3    Can be intercepted


             4    Can be enriched


             5    Communicate intent




Dennis Traub – Software Development Consultancy    @dtraub – mail@dennistraub.de
Command Handlers



             Refactored Application Service Methods:

             1    Unify interface to all application services


             2    Can be wrapped (e.g. Transaction, Authorization, Logging)

             3    Can be enveloped (e.g. REST)




Dennis Traub – Software Development Consultancy                 @dtraub – mail@dennistraub.de
Command Handlers




                                         Rule of thumb:
      One Command Handler per use Case




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
This is CQRS


                                                    Client


       Commands                                                                 Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                            Thin Read Layer



                                                  Data Store

Dennis Traub – Software Development Consultancy                       @dtraub – mail@dennistraub.de
BREAK




Dennis Traub – Software Development Consultancy      @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
Domain Event




Dennis Traub – Software Development Consultancy    @dtraub – mail@dennistraub.de
Domain Event




                              captures the memory of
       something interesting affecting the domain




Dennis Traub – Software Development Consultancy        @dtraub – mail@dennistraub.de
Domain Event




                the essence is to capture         events that
                       trigger a change to the state




Dennis Traub – Software Development Consultancy        @dtraub – mail@dennistraub.de
Domain Event




                       event objects are processed to
                        cause the respective change




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Domain Event




                  and stored to provide an        audit log




Dennis Traub – Software Development Consultancy       @dtraub – mail@dennistraub.de
Shopping Cart




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
we don‘t know:
                          What led to this state?




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Added
            to
           Cart




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Added                  Added
            to                     to
           Cart                   Cart




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Added                  Added            Added
            to                     to               to
           Cart                   Cart             Cart




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Added                  Added            Added   Removed
            to                     to               to      from
           Cart                   Cart             Cart     Cart




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Which model contains more information?




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Shopping Cart




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Added                  Added            Added   Removed
            to                     to               to      from
           Cart                   Cart             Cart     Cart




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
what if we
                   capture every single event?




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
… and reproduce state from
                              this stream of events?




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
An Event Stream …




        Added             Added            Added   Removed
          to                to               to      from
         Cart              Cart             Cart     Cart




Dennis Traub – Software Development Consultancy              @dtraub – mail@dennistraub.de
An Event Stream …




        Added             Added            Added   Removed
          to                to               to      from
         Cart              Cart             Cart     Cart




                                                             Shopping
                                                               Cart
        Can be projected into:




Dennis Traub – Software Development Consultancy                   @dtraub – mail@dennistraub.de
An Event Stream …




        Added             Added            Added   Removed
          to                to               to      from
         Cart              Cart             Cart     Cart



                                                   Sales History
                                                            Shopping
                                                               Cart
              … or into this:




Dennis Traub – Software Development Consultancy                  @dtraub – mail@dennistraub.de
An Event Stream …




        Added             Added            Added   Removed
          to                to               to      from
         Cart              Cart             Cart     Cart



                                                   Sales History
                                                      Audit Trail
                                                            Shopping
                                                               Cart
              … or into this:




Dennis Traub – Software Development Consultancy                  @dtraub – mail@dennistraub.de
An Event Stream …




        Added             Added            Added     Removed
          to                to               to        from
         Cart              Cart             Cart       Cart



                                                     Sales History
                                                        Audit Trail
                                                              Shopping
                                                   Campaign Effectiveness
                                                                 Cart
              … or into this:




Dennis Traub – Software Development Consultancy                    @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
Client


       Commands                                                                 Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                            Thin Read Layer



                                                  Data Store

Dennis Traub – Software Development Consultancy                       @dtraub – mail@dennistraub.de
Client


       Commands                                                                 Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer


                                                               SQL
                       Data Store                             Views


Dennis Traub – Software Development Consultancy                       @dtraub – mail@dennistraub.de
Client


       Commands                                                                 Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer

                                                                          INNER JOIN …
                                                               SQL        LEFT OUTER JOIN …
                       Data Store                             Views       UNION …
                                                                          GROUP BY …

Dennis Traub – Software Development Consultancy                       @dtraub – mail@dennistraub.de
Client


       Commands                                                              Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer

                                                      SELECT * FROM …
                                                                          Table
                       Data Store                                          per
                                                                          Query



Dennis Traub – Software Development Consultancy                    @dtraub – mail@dennistraub.de
Client


       Commands                                                             Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer


                                                                         Table
                       Data Store                                         per
                                                                         Query



Dennis Traub – Software Development Consultancy                   @dtraub – mail@dennistraub.de
Client


       Commands                                                             Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer
                                  Event

                                                                         Table
                       Data Store                                         per
                                                                         Query



Dennis Traub – Software Development Consultancy                   @dtraub – mail@dennistraub.de
Client


       Commands                                                             Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer
                                  Event
                                    Event
                                                                         Table
                       Data Store                                         per
                                                                         Query



Dennis Traub – Software Development Consultancy                   @dtraub – mail@dennistraub.de
Client


       Commands                                                             Queries

                    Command Handlers


                     Domain Model

                         O/R Mapper                        Thin Read Layer
                                  Event
                                    Event
                                      Event
                                                                         Table
                       Data Store                                         per
                                                                         Query



Dennis Traub – Software Development Consultancy                   @dtraub – mail@dennistraub.de
Simplified:




Dennis Traub – Software Development Consultancy       @dtraub – mail@dennistraub.de
Events

                             Domain                          Read Model




            Commands                                                 DTOs




                                                    Client




Dennis Traub – Software Development Consultancy                    @dtraub – mail@dennistraub.de
Some Code




Dennis Traub – Software Development Consultancy    @dtraub – mail@dennistraub.de
Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
if ISBN exists in ShoppingCartDetails
          Increase Amount
      else
          Add New Row




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
if Shopping Cart ID exists in ShoppingCartSummary
          Increase NumberOfItems
          Add OfferedPrice to TotalAmount
      else
          Add New Row




Dennis Traub – Software Development Consultancy      @dtraub – mail@dennistraub.de
Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
if Amount > 1 ShoppingCartDetails
          Decrease Amount
      else
          Delete Row




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Subtract OfferedPrice to TotalAmount
                   Decrease NumberOfItems




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Testability




Dennis Traub – Software Development Consultancy        @dtraub – mail@dennistraub.de
Testing the Write Model



                    Command Handlers


                     Domain Model




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Testing the Write Model



                    Command Handlers

                                                  Given that certain Events happened
                     Domain Model




Dennis Traub – Software Development Consultancy              @dtraub – mail@dennistraub.de
Testing the Write Model

                                                  When a specific Command is sent



                    Command Handlers

                                                  Given that certain Events happened
                     Domain Model




Dennis Traub – Software Development Consultancy              @dtraub – mail@dennistraub.de
Testing the Write Model

                                                               When a specific Command is sent



                    Command Handlers

                                                              Given that certain Events happened
                     Domain Model


                                          Event
                                            Event


                                          Then certain Events (and only those!) should be emitted


Dennis Traub – Software Development Consultancy                           @dtraub – mail@dennistraub.de
Testing the Read Model




                                                  Thin Read Layer


                                                                Table
                                                                 per
                                                                Query



Dennis Traub – Software Development Consultancy          @dtraub – mail@dennistraub.de
Testing the Read Model




                                                  Thin Read Layer

      Given that certain Events happened
                                                                Table
                                                                 per
                                                                Query



Dennis Traub – Software Development Consultancy          @dtraub – mail@dennistraub.de
Testing the Read Model




                                                  Thin Read Layer

      Given that certain Events happened
                                                                Table
                                                                 per
      When a specific Event happens                             Query



Dennis Traub – Software Development Consultancy          @dtraub – mail@dennistraub.de
Testing the Read Model




      Then each query should return the expected results




                                                   Thin Read Layer

      Given that certain Events happened
                                                                  Table
                                                                   per
      When a specific Event happens                               Query



Dennis Traub – Software Development Consultancy            @dtraub – mail@dennistraub.de
Main Values




Dennis Traub – Software Development Consultancy     @dtraub – mail@dennistraub.de
Main Values




                                           additive only
                       we don‘t            lose information




Dennis Traub – Software Development Consultancy            @dtraub – mail@dennistraub.de
Main Values




                                 linearly scalable and
                           distributable Read Model




Dennis Traub – Software Development Consultancy          @dtraub – mail@dennistraub.de
Main Values




                     every new view can be created
                      from the beginning of time




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Main Values




                       We can come up with new questions
                                        at any time




Dennis Traub – Software Development Consultancy       @dtraub – mail@dennistraub.de
Main Values




                     built-in integration model




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
Proven Technology




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
mature business models
                           move away from Update/Delete
                 and become purely                transactional




Dennis Traub – Software Development Consultancy           @dtraub – mail@dennistraub.de
Human resources
                                  Medicine
                                Bookkeeping
                                  Banking
                                  Finances
                                 Government
                                      …


Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de
AGENDA



 DDD Recap                                          CQRS                                    Step by Step
  the strategic patterns                  probably simpler than you think!                      towards CQRS


          1                     2                      3                      4                     5                6
                   „Best Practice“                              Domain Events                                       End
                     what we call an Architecture                    are first class citizens                  Questions & Answers




Dennis Traub – Software Development Consultancy                                                     @dtraub – mail@dennistraub.de
?

                                        QUESTIONS



Dennis Traub – Software Development Consultancy       @dtraub – mail@dennistraub.de
THANK YOU!




Dennis Traub – Software Development Consultancy   @dtraub – mail@dennistraub.de

More Related Content

PDF
From DDD to CQRS
PDF
Strategic Appplication Development with Domain-Driven Design (DDD)
PDF
Strategischer Anwendungsentwurf mit Domain-Driven Design
PDF
Cdp Colour Print Fact Sheet A W
PPT
Sneaking Scala through the Back Door
PPTX
CQRS-Einführung - Teil 2
PDF
CQRS - Eine Einführung - NOUG 2011
PDF
Taming the Monolith
From DDD to CQRS
Strategic Appplication Development with Domain-Driven Design (DDD)
Strategischer Anwendungsentwurf mit Domain-Driven Design
Cdp Colour Print Fact Sheet A W
Sneaking Scala through the Back Door
CQRS-Einführung - Teil 2
CQRS - Eine Einführung - NOUG 2011
Taming the Monolith

Similar to An Introduction to CQRS (20)

PPTX
A Practical Guide to Domain Driven Design: Presentation Slides
PPTX
Lets focus on business value
PPTX
.NET Architecture for Enterprises
PPTX
Lets focus on business value
PPTX
Lets focus on business value
PPTX
An Introduction to Domain Driven Design in PHP
PDF
Domain Driven Design Development Spring Portfolio
PPTX
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
PPTX
Designing DDD Aggregates
PDF
SOAT Agile Day 2017 DDD
PDF
Twin Cities Salesforce.com Developer User Group Presentation April 2012
PPT
Domain Driven Design (DDD)
PPT
Designingapplswithnet
PPTX
Domain Driven Design
PDF
Domain Driven Design
PDF
Why there is no future for Model Driven Development
PDF
Design Software Driven by Domain
PPTX
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
PPTX
Software Engineering Primer
A Practical Guide to Domain Driven Design: Presentation Slides
Lets focus on business value
.NET Architecture for Enterprises
Lets focus on business value
Lets focus on business value
An Introduction to Domain Driven Design in PHP
Domain Driven Design Development Spring Portfolio
.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design
Designing DDD Aggregates
SOAT Agile Day 2017 DDD
Twin Cities Salesforce.com Developer User Group Presentation April 2012
Domain Driven Design (DDD)
Designingapplswithnet
Domain Driven Design
Domain Driven Design
Why there is no future for Model Driven Development
Design Software Driven by Domain
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
Software Engineering Primer
Ad

More from Dennis Traub (8)

PDF
Application Integration Patterns (not only) for Microservices
PDF
Serverless SecOps Automation on AWS at AWS UG Krakow, Poland
PDF
Serverless Security Automation on AWS - Hamburg AWS User Group
PDF
Cloud ist keine Strategie - Keynote des AWS Cloud Day, Solingen
PDF
Cloud ist keine Strategie - AWS Tech Community Summit Cologne, 2017
PDF
Taming the Monolith - Microservices Meetup Hamburg
PDF
DDD / Microservices @ Trivento Spring Camp, Utrecht, 2015
PPTX
DDD Modeling Workshop
Application Integration Patterns (not only) for Microservices
Serverless SecOps Automation on AWS at AWS UG Krakow, Poland
Serverless Security Automation on AWS - Hamburg AWS User Group
Cloud ist keine Strategie - Keynote des AWS Cloud Day, Solingen
Cloud ist keine Strategie - AWS Tech Community Summit Cologne, 2017
Taming the Monolith - Microservices Meetup Hamburg
DDD / Microservices @ Trivento Spring Camp, Utrecht, 2015
DDD Modeling Workshop
Ad

Recently uploaded (20)

PPTX
TLE Review Electricity (Electricity).pptx
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
1. Introduction to Computer Programming.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Encapsulation theory and applications.pdf
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Getting Started with Data Integration: FME Form 101
PDF
WOOl fibre morphology and structure.pdf for textiles
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
Hindi spoken digit analysis for native and non-native speakers
PDF
Web App vs Mobile App What Should You Build First.pdf
PDF
August Patch Tuesday
PDF
Hybrid model detection and classification of lung cancer
PDF
project resource management chapter-09.pdf
TLE Review Electricity (Electricity).pptx
Accuracy of neural networks in brain wave diagnosis of schizophrenia
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Assigned Numbers - 2025 - Bluetooth® Document
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
1. Introduction to Computer Programming.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Encapsulation theory and applications.pdf
A comparative analysis of optical character recognition models for extracting...
Getting Started with Data Integration: FME Form 101
WOOl fibre morphology and structure.pdf for textiles
Encapsulation_ Review paper, used for researhc scholars
Programs and apps: productivity, graphics, security and other tools
cloud_computing_Infrastucture_as_cloud_p
Hindi spoken digit analysis for native and non-native speakers
Web App vs Mobile App What Should You Build First.pdf
August Patch Tuesday
Hybrid model detection and classification of lung cancer
project resource management chapter-09.pdf

An Introduction to CQRS

  • 1. An Introduction to Command/Query Responsibility Segregation presented by Dennis Traub .NET Stammtisch Konstanz/Kreuzlingen - 20. März 2013 Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 2. Who‘s that guy? Dennis Traub Founder, Owner, CEO, Single Employee of D. Traub Software Development Consultancy Consultant, developer, trainer, speaker 39 years old Married, father of one 20+ years in software development Hire me at mail@dennistraub.de @dtraub Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 3. AGENDA DDD Recap CQRS Break Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 4. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 5. The „Blue Book“ by Eric Evans Image Placeholder Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 6. Domain-Driven Design Domain Service Value Object Aggregate Specification The well- known Reposit ory Patterns Entity Factory And so on . . Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 7. Domain-Driven Design Ubiquit ous Language Core Domain Domain Expert Bounded Context The important Domain Model Patterns (Generic) Subdomains Context Map And so on . . Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 8. don‘t build one big model that works for everyone Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 9. the tactical Building Blocks we don‘t use DDD when there is no value in formalizing the problem Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 10. we only use DDD in parts where we get a competitive advantage Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 11. we focus our effort and resources on the most important subdomain Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 12. a.k.a. The Core Domain Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 13. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 14. Presentation Layer Application Services Domain / Business Model / BLL DAL / O/R-Mapper Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 15. Pros of the „Best Practice Architecture“ 1 Easy to build 2 Accepted by management 3 Well-know throughall all seniority levels 4 We know ist limitiations Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 16. Cons of the „Best Practice Architecture“ 1 Limited scalability 2 Loss of intent 3 Lazy loading, locking, race conditions, … 4 Few classes do way too much stuff Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 17. And: If the model is basically CRUD where does Business Logic live? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 18. Domain Model Responsibilities 1 Business Logic 6 Aggregation 2 Validation 7 Presentation 3 Structure 8 Persistence 4 Projection 9 Processes 5 Associations 10 Lazy / Eager Loading Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 19. the S in SOLID Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 20. SINGLE RESPONSIBILITY PRINCIPLE Just because you can doesn‘t mean you should Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 21. why do we try to build One Model to Rule Them All? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 22. reading and writing are completely different from eachother Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 23. Sometimes it‘s cheaper to do two things than dealing with the trade-offs Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 24. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 25. Command Query Separation Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 26. Command Query Separation (CQS) „Every method should either be a command that performs an action or a query that returns data to the caller“ -- Dr. Bertrand Meyer Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 27. Command Query Separation (CQS) in other words: Asking a question should not change the answer Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 28. Command/Query Responsability Segregation Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 29. CQS on an Architectural Level Queries Commands Project Details Project List Project Data Store Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 30. Queries and Projection (Read) Show something Thin Read Layer Data Store Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 31. Thin Read Layer Concerns: 1 Filtering, Scope 2 Data Presentation Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 32. Thin Read Layer Attributes: 1 Data-Oriented 2 Indexable 3 Can be denormalized and distributed for fast access 4 Only Structure Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 33. Behavior and Modification (Write) Do something Command Handler Domain Model O/R-Mapper Data Store Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 34. Domain Model Concerns: 1 Business Logic 2 Validation Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 35. Domain Model Attributes: 1 Normalized 2 Transactional 3 Object-Oriented 4 Persistence Ignorant 5 Only Behavior Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 36. Commands Refactor Application Service Calls to Objects 1 Serializable 2 Can be enveloped 3 Can be intercepted 4 Can be enriched 5 Communicate intent Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 37. Command Handlers Refactored Application Service Methods: 1 Unify interface to all application services 2 Can be wrapped (e.g. Transaction, Authorization, Logging) 3 Can be enveloped (e.g. REST) Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 38. Command Handlers Rule of thumb: One Command Handler per use Case Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 39. This is CQRS Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Data Store Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 40. BREAK Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 41. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 42. Domain Event Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 43. Domain Event captures the memory of something interesting affecting the domain Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 44. Domain Event the essence is to capture events that trigger a change to the state Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 45. Domain Event event objects are processed to cause the respective change Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 46. Domain Event and stored to provide an audit log Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 47. Shopping Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 48. we don‘t know: What led to this state? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 49. Added to Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 50. Added Added to to Cart Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 51. Added Added Added to to to Cart Cart Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 52. Added Added Added Removed to to to from Cart Cart Cart Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 53. Which model contains more information? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 54. Shopping Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 55. Added Added Added Removed to to to from Cart Cart Cart Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 56. what if we capture every single event? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 57. … and reproduce state from this stream of events? Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 58. An Event Stream … Added Added Added Removed to to to from Cart Cart Cart Cart Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 59. An Event Stream … Added Added Added Removed to to to from Cart Cart Cart Cart Shopping Cart Can be projected into: Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 60. An Event Stream … Added Added Added Removed to to to from Cart Cart Cart Cart Sales History Shopping Cart … or into this: Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 61. An Event Stream … Added Added Added Removed to to to from Cart Cart Cart Cart Sales History Audit Trail Shopping Cart … or into this: Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 62. An Event Stream … Added Added Added Removed to to to from Cart Cart Cart Cart Sales History Audit Trail Shopping Campaign Effectiveness Cart … or into this: Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 63. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 64. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Data Store Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 65. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer SQL Data Store Views Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 66. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer INNER JOIN … SQL LEFT OUTER JOIN … Data Store Views UNION … GROUP BY … Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 67. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer SELECT * FROM … Table Data Store per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 68. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Table Data Store per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 69. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Event Table Data Store per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 70. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Event Event Table Data Store per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 71. Client Commands Queries Command Handlers Domain Model O/R Mapper Thin Read Layer Event Event Event Table Data Store per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 72. Simplified: Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 73. Events Domain Read Model Commands DTOs Client Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 74. Some Code Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 75. Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 76. Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 77. if ISBN exists in ShoppingCartDetails Increase Amount else Add New Row Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 78. if Shopping Cart ID exists in ShoppingCartSummary Increase NumberOfItems Add OfferedPrice to TotalAmount else Add New Row Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 79. Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 80. Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 81. if Amount > 1 ShoppingCartDetails Decrease Amount else Delete Row Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 82. Subtract OfferedPrice to TotalAmount Decrease NumberOfItems Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 83. Testability Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 84. Testing the Write Model Command Handlers Domain Model Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 85. Testing the Write Model Command Handlers Given that certain Events happened Domain Model Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 86. Testing the Write Model When a specific Command is sent Command Handlers Given that certain Events happened Domain Model Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 87. Testing the Write Model When a specific Command is sent Command Handlers Given that certain Events happened Domain Model Event Event Then certain Events (and only those!) should be emitted Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 88. Testing the Read Model Thin Read Layer Table per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 89. Testing the Read Model Thin Read Layer Given that certain Events happened Table per Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 90. Testing the Read Model Thin Read Layer Given that certain Events happened Table per When a specific Event happens Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 91. Testing the Read Model Then each query should return the expected results Thin Read Layer Given that certain Events happened Table per When a specific Event happens Query Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 92. Main Values Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 93. Main Values additive only we don‘t lose information Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 94. Main Values linearly scalable and distributable Read Model Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 95. Main Values every new view can be created from the beginning of time Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 96. Main Values We can come up with new questions at any time Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 97. Main Values built-in integration model Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 98. Proven Technology Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 99. mature business models move away from Update/Delete and become purely transactional Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 100. Human resources Medicine Bookkeeping Banking Finances Government … Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 101. AGENDA DDD Recap CQRS Step by Step the strategic patterns probably simpler than you think! towards CQRS 1 2 3 4 5 6 „Best Practice“ Domain Events End what we call an Architecture are first class citizens Questions & Answers Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 102. ? QUESTIONS Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de
  • 103. THANK YOU! Dennis Traub – Software Development Consultancy @dtraub – mail@dennistraub.de