Lärarguide · Lektion 3 av 10

Aggregate & AggregateRoot

Kursens hjärta. Här bygger studenten sin första AggregateRoot<TId> från scratch och förstår varför invarianter måste leva inuti aggregatet.

V2 Mån
Vecka / Dag
4 h
Total tid
90 min
Teori
130 min
Workshop

Mål

Agenda

0:00
Recap från L2. Definitionerna sitter — testa med 3 snabba frågor.
0:15
Teori: aggregat = transaktionsgräns. Varför inte hela domänen är ett aggregat.
0:45
Teori: AggregateRoot & Apply-pattern, demo i live-kod.
1:30
Paus 15 min
1:45
Workshop: bygg Account-aggregat. Deposit + Withdraw + invarianter.
3:45
Genomgång av vanliga fel. Hemuppgift presenteras.
4:00
Slut

Talartips

När du visar Apply-pattern: kod inte affärslogik in i Apply-metoden! Det är klassiskt nybörjarfel. Beslutslogiken är i Deposit; Apply bara muterar tillstånd.
Visa det "felaktiga" alternativet först (sätta Balance direkt i Deposit-metoden), så att Apply-pattern framstår som lösningen på ett verkligt problem — inte ett ritual.
Aggregat-gränser är subjektiva. Det är OK att två lärare ritar dem olika. Diskutera olika varianter på whiteboard.

Workshop

  1. Skapa AggregateRoot<TId> abstrakt klass.
  2. Skapa Account : AggregateRoot<AccountId>.
  3. Implementera MoneyDeposited + MoneyWithdrawn events.
  4. Implementera invarianter: minst 0 kr saldo (eller kreditgräns), aktiv status.
  5. Skriv 3 enhetstester med Given-When-Then.

Snabba

  • Lägg till Close-funktion + invariant: kan inte stänga konto med saldo.

Stöd

  • Tillhandahåll en halvfärdig AggregateRoot-skiss att fylla i.
  • Para för pair-programming.

FAQ

Får aggregatet referera till andra aggregat?
Endast via ID. Inte via objektsreferens. Annars löses gränsen upp.
Hur stort får ett aggregat vara?
Så litet som möjligt medan invarianterna fortfarande hålls. Tumregel: om du skriver två aggregat i samma transaktion — slå ihop dem, eller acceptera eventual consistency mellan dem (saga).
Behöver Apply-metoden vara private?
Ja, eller protected. Aldrig public — ingen utanför aggregatet ska kunna applicera events.
Hemuppgift Soloprojekt 1 från lektion 03 (utöka Account med Reopen och tester).
Förberedelse till L4 Installera MediatR (8.x för open source, eller en planerad fork). Kör dotnet add package MediatR.

← L2 L4 →