Autoplay
Autocomplete
Previous Lesson
Complete and Continue
Pragmatic Clean Architecture
Course Introduction
Welcome (0:43)
What you will learn in this course (1:02)
Who this course is for (0:54)
What are the prerequisites for taking this course (1:06)
Clean Architecture Fundamentals
Architectural principles & Design principles (6:11)
Clean Architecture layers (3:06)
What we are building & why (1:48)
Chapter recap (0:35)
Domain Layer
Introduction (2:00)
Creating the Domain project (1:04)
Defining our first domain entity (4:02)
What is an Entity in Domain-Driven Design? (2:38)
Introducing Value Objects for solving primitive obsession (8:23)
The importance of private setters in the domain model and encapsulation (0:24)
Using the Static Factory pattern in the domain (3:11)
Introducing the Domain Events pattern to the solution (3:08)
Adding Repositories and the Unit of Work to the domain (1:53)
Creating the Booking entity (3:31)
Implementing a Domain service (3:57)
Using Double Dispatch for a better domain model (1:20)
Introducing the Result class to the project (3:16)
Defining a dictionary of domain errors (1:18)
Chapter recap (0:26)
Application Layer
Introduction (5:08)
Creating the Application project (0:23)
Configuring dependency injection and installing MediatR (2:31)
Adding the required abstractions for CQRS (3:39)
Implementing Commands with the rich domain model & repositories (8:46)
Defining a domain event handler (4:25)
Implementing Queries with Dapper for blazing performance (9:49)
Solving logging as a cross-cutting concern (3:48)
Creating a Validation pipeline for commands (5:46)
Chapter recap (0:37)
Infrastructure Layer
Introduction (1:01)
Creating the Infrastructure project (0:21)
Configuring infrastructure services with dependency injection (3:06)
Adding Entity Framework Core to the solution (1:24)
Configuring Entity Framework Core with dependency injection (1:37)
Creating the Domain entity configurations (3:34)
Automatically applying entity configurations (0:45)
Implementing repository interfaces using a generic repository (2:59)
Implementing the SQL connection factory (1:51)
Publishing domain events inside the Unit of Work (4:17)
Solving race conditions with optimistic concurrency (4:41)
Chapter recap (0:27)
Presentation Layer
Introduction (1:05)
Creating the Presentation project (2:39)
Configuring services with dependency injection (0:52)
Adding Controllers and endpoints (5:33)
Setting up Docker Compose and running the API (3:48)
Creating EF migrations and applying them (4:19)
Seeding initial data (1:44)
Adding Middleware - Global exception handler (2:29)
Demo: Presentation layer & API (1:58)
Chapter recap (0:37)
Authentication
Introduction (1:19)
Keycloak identity provider setup (2:06)
Keycloak admin panel overview (1:22)
Demo: Obtaining JWTs using Keycloak (1:39)
Configuring authentication middleware & services (1:57)
Configuring JWT authentication options (2:08)
Demo: Authentication in action (0:42)
Implementing the user registration feature (2:56)
Adding an API endpoint for registering a user (1:21)
Implementing the authentication service (3:01)
Configuring the authentication service as a typed HTTP client (1:49)
Demo: User registration with Keycloak (0:47)
Implementing the user login feature (3:05)
Demo: User login with Keycloak (0:43)
Chapter recap (0:23)
Advanced Topics
Introduction (0:32)
Strongly Typed IDs (7:59)
Minimal APIs (8:50)
Transactional Outbox Pattern (12:44)
Chapter recap (0:22)
Testing
Introduction (1:01)
Unit testing in Clean Architecture (2:22)
Architecture tests (3:01)
Chapter recap (0:22)
Course Summary + Small Favor?
A small ask from me... (1:29)
BONUS: Some complimentary content
Adding the required abstractions for CQRS
Complete and Continue