WHAT'S INSIDE

Earn the patterns. Don't just apply them.

Each chapter follows the same rhythm: notice the friction, reshape the code, and watch a DDD building block emerge naturally.

.NET 10

ASP.NET Core Web API

Entity Framework

Modern data access

PostgreSQL

Reliable, production-grade database

xUnit + Testcontainers

Real unit and integration tests

Pragmatic, refactor-first approach

We don't prescribe DDD patterns up front. We start with a real procedural codebase, listen to where it resists change, and refactor toward a domain model that earns its complexity.

Two real "monster" handlers

Two procedural handlers thread through the course. The friction is systemic, and the refactoring works on both.

Real-world complexity, not toy demos

Most DDD content stops at a Customer with an Address. This course goes much further: a Learnify domain with course capacity, tiered revenue share, refund cascades across aggregates, and bounded contexts that span Catalog, Learning, Billing, and Identity. Patterns you can actually apply to the codebase you ship.

Tagged code state for every chapter

Each chapter has a clear starting and ending git ref, so you can drop in at any point. Skip ahead, jump back, or follow the whole arc. It's up to you.

What you'll learn

By the end of the course, you'll be able to:

  • Establish a Ubiquitous Language between code and the business
  • Read code for friction signals to drive refactoring decisions
  • Push behavior into entities by listening to where it wants to live
  • Encapsulate data with private setters, factories, and value objects
  • Encapsulate collections with backing fields and read-only access
  • Unit test domain entities and value objects directly, no infrastructure required
  • Use domain events to decouple cascading side effects
  • Draw aggregate boundaries that protect transactional invariants
  • Identify bounded contexts with concrete teeth (Catalog, Learning, Billing, Identity)
  • Know when to apply these techniques, and when to leave code simple

THE FULL CURRICULUM

15 chapters. 38 lessons.

Five phases (Foundations, Story, Domain Model, Hardening, and Strategic View) move you from a procedural codebase to a rich domain model with bounded contexts.

01

Introduction

Welcome
  • Welcome and what you’ll build
  • Audience and setup
02

Why Rich Domain Models

Concept
  • The Anemic Domain Model anti-pattern
  • Why prescriptive DDD doesn’t work
  • Friction signals as our guide
03

The Ubiquitous Language

Concept
  • Why language matters more than patterns
  • Discovering Learnify’s language
04

The Starting Codebase

Walkthrough
  • Project structure walkthrough
  • The two monster handlers and the friction inventory
05

Making the Handler Tell a Story

Practical
  • When a handler does too much
  • Stepping the handler down a level of abstraction (demo)
  • Isolating the external integration as a Domain Service
06

Pushing Behavior into the Domain

Practical
  • Why our handler is still procedural
  • Undo, reshape, relocate
  • Behavior on the entity
07

Sealing Entity State

Practical
  • Why public setters defeat domain methods
  • Private setters and the factory
  • EF Core compatibility and exercise
08

Eliminating Primitives with Value Objects

Practical
  • The value-object concept
  • Money (with currency invariants) and Email
  • Tiered revenue share and EF Core
09

Protecting Collections

Practical
  • Why exposed collections leak
  • Encapsulating collections
10

Testing the Domain Model

Practical
  • The testing pyramid for a rich domain
  • Unit tests on entities and value objects
  • Integration tests at the handler boundary
11

Decoupling Side Effects with Domain Events

Practical
  • The event concept
  • Define, raise, dispatch
  • Move side effects (the refund cascade)
12

Making Implicit Concepts Explicit

Practical
  • Smart enumerations for CourseStatus
  • Policies: RefundPolicy and tiered RevenueSharePolicy
13

Aggregate Design

Practical
  • What is an aggregate? (with capacity as the real invariant)
  • Diagnose the current Course aggregate
  • Extract Enrollment and reference by id
14

Strategic Design & Bounded Contexts

Concept
  • The “one model” trap
  • Bounded contexts and the context map
  • Mapping patterns and modular monolith vs microservices
15

Wrap-Up & Next Steps

Recap
  • Before & after
  • Where next, and closing thoughts
Join the Waitlist
Course student
Course student
Course student
Course student
Course student
Course student
9,500+ engineers shipping better code
Milan Jovanović

WHO'S BEHIND THIS

Hi, I'm Milan Jovanović. I help software engineers improve their .NET and software architecture skills.

I'm a Software Architect and Microsoft MVP for Developer Technologies with years of experience building large-scale systems with rich domain models.

I've helped thousands of engineers level up through my practical tips on social media, The .NET Weekly newsletter, and my YouTube channel.

My goal with this course is simple: teach you to read code for friction signals and refactor toward a domain model that earns its complexity, without ceremony or dogma.

Microsoft MVP Badge.

GOT QUESTIONS?

Frequently Asked Questions

  • Who is this course for?

    Intermediate .NET developers who are comfortable with C# and Entity Framework, but new to Domain-Driven Design. Or who've tried DDD and ended up with anemic models anyway.

    If you write production .NET applications and want to push real behavior into your domain model, this course is for you. No prior DDD knowledge is required.

  • What will I learn?

    You'll learn how to refactor a procedural codebase into a rich domain model by reading the code, listening to friction signals, and relocating behavior toward where it belongs.

    • The Ubiquitous Language and Bounded Contexts
    • Entities with real behavior (and sealed state)
    • Value Objects with real invariants (currency, ranges, money)
    • Domain Events and the refund cascade
    • Aggregate boundaries and capacity invariants
    • Testing rich domain models

    All examples target .NET 10.

  • How is this different from other DDD courses?

    Most DDD content prescribes patterns up front. This course does the opposite: it starts with a real, ugly procedural codebase and lets the DDD building blocks (Entity, Value Object, Domain Service, Aggregate, Bounded Context) emerge as we refactor. By the end, every pattern you use is one you earned, not one you copied.

  • What tech stack is used?

    • .NET 10 / ASP.NET Core Web API
    • Entity Framework Core with PostgreSQL (via Docker)
    • Custom CQRS abstractions
    • xUnit with Testcontainers for unit and integration tests
  • When does the course launch?

    I'm putting the finishing touches on it now. Join the waitlist and you'll get an email the moment it goes live, plus an early-bird discount.

  • Will there be early-bird pricing?

    Yes. Everyone on the waitlist gets first access to the launch discount before the course is announced publicly.

  • Got more questions?

BE THE FIRST TO KNOW

Get early access to Pragmatic Domain-Driven Design

Join the waitlist and I'll send a heads-up the moment the course goes live, plus an exclusive early-bird discount for people on the list.

Course student
Course student
Course student
Course student
Course student
Course student
9,500+ engineers shipping better code
15 chapters
38 lessons
.NET 10