Event Sourcing Is About Behaviour, Not State

Why meaningful domain events preserve business behaviour instead of merely recording property changes or CRUD updates.

event-sourcingdomain-driven-designvalue-objects
The hardest part of Event Sourcing isn't rebuilding aggregates from events. It's learning to model business behaviour instead of changes to state.

An order stream can rebuild state perfectly while still looking like CRUD in disguise: • DeliveryStreetChanged • DeliveryPostalCodeChanged • OrderStatusChanged Compare that to: • DeliveryAddressChanged • OrderConfirmed • OrderCancelled • OrderShipped Both streams can reconstruct the same aggregate, but they preserve very different histories. In my latest post, I explore the difference between Event Sourcing, property sourcing and CRUD sourcing, and why value objects together with intention-revealing aggregate methods naturally lead to richer domain events. https://markusbengtsson.dev/blog/event-sourcing-is-about-behaviour-not-state #EventSourcing #DDD #DomainDrivenDesign #SoftwareArchitecture #DotNet

The Illusion of Understanding

Why modelling data instead of the domain leads to scattered business logic, and how a domain model puts decisions back where they belong.

domain-driven-designdomain-modeling
The hardest part of domain modelling isn't identifying the data. It's discovering the business behaviour that gives the data meaning.

A clean data model can create a convincing picture of the domain: • Customers • Orders • Invoices • Products But it doesn't tell us: • which decisions the business makes • why state changes • which rules govern those changes • which exceptions actually matter The structure may be correct while the behaviour remains scattered across handlers, validators, jobs and UI code. In my latest post, I explore the illusion of understanding created by data-first modelling, and how focusing on decisions and behaviour leads to a domain model that expresses more than stored information. https://markusbengtsson.dev/blog/the-illusion-of-understanding #DomainModeling #DDD #DomainDrivenDesign #SoftwareArchitecture #SoftwareDesign

From Primitive Types to Value Objects

How value objects in Domain-Driven Design help express meaning, protect rules, and make your domain model more trustworthy.

domain-driven-designvalue-objectscsharp
The hardest part of introducing value objects isn't writing the wrapper. It's recognizing when a primitive has started carrying domain meaning.

A domain model can look strongly typed while still allowing invalid or meaningless combinations: • string emailAddress • decimal amount • Guid customerId Compare that to: • EmailAddress emailAddress • Money amount • CustomerId customerId Both versions hold the same underlying data, but only one preserves what those values mean and which rules belong to them. In my latest post, I explore how to recognize primitive obsession, when a value deserves its own type, and how value objects turn compiler type safety into domain safety. https://markusbengtsson.dev/blog/from-primitive-types-to-value-objects #ValueObjects #DDD #DomainDrivenDesign #CSharp #SoftwareDesign

What Is a Domain Event?

A practical explanation of domain events and how they differ from technical events in software systems.

domain-driven-designeventsevent-sourcing
The hardest part of working with Domain Events isn't publishing them. It's deciding whether an event describes something meaningful in the business or merely something the software did.

An event-driven system can contain events such as: • RowInserted • EntitySaved • StatusChanged Compare that to: • OrderPlaced • PaymentReceived • AppointmentCancelled • OrderShipped Both lists describe things that happened, but only one reads like a history the business would recognize. In my latest post, I explore what makes an event a Domain Event, how it differs from a technical event, and why that distinction matters even more when events become the source of truth. https://markusbengtsson.dev/blog/what-is-a-domain-event #DomainEvents #DDD #DomainDrivenDesign #EventSourcing #EventDrivenArchitecture