Vi separerar skriv- och läsmodeller. MediatR-pipeline introduceras med logging, validation och idempotency. Minimal API binder ihop allt.
V2 Tor
Vecka / Dag
4 h
Total tid
100 min
Teori
120 min
Workshop
Mål
Studenten implementerar en command + handler via MediatR.
Studenten kan förklara skillnaden mellan CRUD och CQRS.
Studenten har minst en pipeline behavior i sitt projekt (validation eller idempotency).
Agenda
0:00
Recap aggregat. Bron till "hur anropar man aggregatet utifrån?".
0:15
Teori: CQRS — skriv vs läs.
0:45
Teori: MediatR pipeline med behaviors (live-demo).
1:30
Teori: Minimal API + idempotency-headers.
1:45
Paus 15 min
2:00
Workshop: DepositMoneyCommand end-to-end.
3:45
Diskussion: MediatR-licens 2024. Alternativ (Brighter, Wolverine, egen).
4:00
Slut
Talartips
Visa pipeline-behaviors som "Russian doll" — varje behavior wrap:ar nästa. Använd en penna i handen för att gestikulera.
Idempotency-konceptet förvirrar ofta — ge konkret exempel: "användaren tappade nätet och tryckte 'betala' två gånger". Lösningen är klient-genererad Idempotency-Key.
Var ärlig kring MediatR-licens: open-source 2.x → kommersiell för produktion i 2024. För kursen använder vi 12.x under "open source"-villkor; för stora team i produktion får man välja medvetet.
Workshop
Skapa DepositMoneyCommand + DepositMoneyHandler.
Registrera MediatR i DI.
Skapa Minimal API-endpoint POST /accounts/{id}/deposit.
Lägg till FluentValidation + ValidationBehavior.
Lägg till en enkel idempotency-tabell + behavior som dedup:ar.
Verifiera med Postman/curl: dubbel POST med samma Idempotency-Key ska bli en endast en insättning.
Snabba
Lägg till WithdrawMoneyCommand.
Skriv ett behavior som mäter latency per command-typ och loggar.
Stöd
Förbered ett startfärdigt projekt med MediatR redan konfigurerat.
Ge dem strukturen för Handler — fyll i affärslogik.
FAQ
Måste man använda MediatR för CQRS?
Nej. CQRS är ett mönster, MediatR är ett verktyg. Du kan implementera mönstret med vanlig DI eller egen dispatcher.
Bör commands returnera värden?
Klassiskt: void. Praktiskt i webb-API: returnera ett ID eller en bekräftelse. Pragmatism vinner.
Vad händer om Idempotency-Key återanvänds av misstag?
Andra requesten returnerar samma svar som första. Det är poängen.
Fallgrop att lyfta Studenter försöker ibland skicka events från MediatR-handlers direkt. Förklara att events ska gå via repository → event store. MediatR.Publish är för intra-process pub-sub, vilket är en annan sak.
Hemuppgift Övningar 1–4 lektion 04 + sätt igång med projektskelett för gruppuppgiften.
Förberedelse till L5 Studenten ska tänka på "hur skulle ni testa ett aggregat utan databas?" — bro till in-memory event store.