Code like the client talks

(wow dat mess)

Ubiquitous language

Client doesn't say:

"new pdf after postPersist or postUpdate"

Client says:


"on payment receival, send the invoice"

Use this vocabulary

(and stick with it)

Task Based




the command (handler) acts as the entry point (a controller!) in our domain model.


It is framework agnostic


the controller is the one that glues framework to domain model.


It validates and creates a command based  on the  request

Command (handler) retrieve the write model instance, and calls methods on it.



Maybe there is no need of a Command AND a controller after all ?


not always, so KISS

Some BS:

  • command bus (sometimes)
  • command handler (sometimes)
  • AsyncCommandBusQueueHandlerFactoryBuilder

(wow, easy bro)

Write model writes only (genius)

Separate persistence

(Always) start from a single entry point:


An Aggregate Root (AR)

AR keeps consistency inside the aggregate

Since modification is only possible from an AR, it's the guardian

(of the galaxy)

Change through methods

that say something!


and keep encapsulation in the meantime

Remember: same vocabulary

Client says:


Client doesn't say:



Changes have Consequences


Client doesn't say:



Client says:




(not the voice of god)

AR emits events


that say something happened

Things a client understand, and so do you





PS: naming events are hard,

it needs many "event stormings" with client

Listen, then DO

Implement listeners that listen to domain events

  • generate pdf
  • broadcast via websockets
  • do heavy stuff async


cool story bro, but atm we don't display anything

AR are not made to display things

Create a separate read model, optimized for reads

Implement a domain event listener that creates projections of what happened

Event Sourcing

not necessary


we can use a good old ORM for the writes and the reads (just separate them)

Two birds with one stone

domain events listeners


replaying events

Store each event

and from which AR it comes

Replay them on an empty instance, until you have your previous sate

ddd cqrs es

By Florian Klein

ddd cqrs es

  • 520
Loading comments...

More from Florian Klein