Lärarhandledning · L5
Arkitekturgrund
Den viktigaste lektionen: varför det manuella grundarbetet bestämmer kvaliteten på allt AI genererar efteråt.
Lektionsmål
- Förklara varför arkitekturgrunden måste byggas manuellt och inte delegeras till AI
- Implementera
AggregateRoot<TId> och Result<T> korrekt i C#
- Skriva minst en ADR (Architecture Decision Record) i standardformat
- Använda checklistan innan AI-delegering
Agenda
0:00–0:35
Varför manuell foundation — 80/20-regeln
Förklara: AI genererar kod baserat på kontext. Utan en väldefinierad foundation saknar AI:n referenspunkter och genererar generisk kod. Visa konkret: samma prompt med och utan AggregateRoot.cs i kontexten.
0:35–1:15
Demo — Bygg AggregateRoot<TId> och Result<T> live
Koda referensimplementationen live. Kör ADR-001 efteråt.
1:15–1:30
Checklist och prompt-mall för instruktionsgenerering
Gå igenom checklistan. Visa promptmallen från del 06 som tar koden och genererar instruktionsfilen.
1:45–2:55
Workshop
Se workshopbeskrivning nedan.
Demo-script — AggregateRoot live-implementation
Börja med Result<T> (enklaste)
Bygg Result<T> steg för steg: Success-state, Failure-state, IsSuccess-property, DomainError-record. Visa att konstruktorerna är privata — det är obligatoriskt.
Sedan AggregateRoot<TId>
Bygg basklassen med: Id-property, _domainEvents (private List), AddDomainEvent(), ClearDomainEvents(). Visa att inga subklasser ska känna till _domainEvents — de anropar bara AddDomainEvent().
ADR-001 — Skriv live i Markdown
# ADR-001: AggregateRoot<TId> som bastyp
## Status
Accepted
## Kontext
Vi behöver ett konsekvent sätt att hantera domänhändelser och Id-typer.
## Beslut
Alla aggregat ärver från AggregateRoot<TId> i Domain.Common.
## Konsekvenser
+ Konsekvent Id-hantering
+ Centraliserad händelseregistrering
- Alla nya aggregat måste känna till basklassen
Workshop — instruktioner
Workshop L5 — Bygg din foundation manuellt
- Skapa ett nytt C#-projekt med tre lager: Domain, Application, Api
- Implementera
AggregateRoot<TId> och Result<T> manuellt (utan att kopiera från del 06)
- Skriv ADR-001 för AggregateRoot-valet och ADR-002 för Result<T>
- Kör checklistan från del 06 och bocka av varje punkt
- Kör promptmallen från del 07 och generera en förstaversion av domain.instructions.md — spara den till L6
FAQ
| Fråga | Svar |
| "Kan inte AI bygga AggregateRoot-klassen åt mig?" |
Tekniskt ja. Men poängen är att du måste förstå varje rad för att kunna skriva meningsfulla instruktionsfiler och granska det AI genererar senare. Om du inte förstår basklassen, förstår du inte avvikelserna i den genererade koden. |
| "Varför Result<T> istället för exceptions?" |
Exceptions är för exceptionella fel (programmeringsfel, infrastrukturproblem). Affärsbegränsningar ("du kan inte beställa en negativ mängd") är inte exceptionella — de är förväntade. Result<T> gör dem synliga i signaturen. |
| "Vad ska en ADR innehålla?" |
Minst: Status (Accepted/Rejected/Deprecated), Kontext (varför tog vi beslutet?), Beslut (vad bestämde vi?), Konsekvenser (+ och -). Längd spelar ingen roll — tydlighet gör det. |
Nästa lektion — förberedelse
Läs del 07 (Instruktionsfiler) och ha med den genererade domain.instructions.md från workshopen till L6.