Lärarguide · Lektion 5 av 10
Event sourcing från grunden
Vi bygger en in-memory event store från noll. Målet: avmystifiera. Event sourcing är inte magi — bara en lista.
Mål
- Studenten implementerar
IEventStore + InMemoryEventStore.
- Studenten skriver Given-When-Then-tester mot ett rehydrerat aggregat.
- Studenten kan förklara upcasting och varför event-versionering är oundvikligt.
Agenda
0:00
Recap CQRS. "Vad är egentligen ett event?"
0:15
Teori: event som sanning. Demo: räkna ut saldo från en lista av events i konsolen.
0:50
Teori: EventSourcedRepository — save vs load-cykel.
1:30
Teori: event-versionering, upcasting, snapshots (förvarning, detaljer i L9).
2:00
Workshop: implementera in-memory store + tester.
3:45
Diskussion: när är event sourcing rätt val? När är det fel?
Talartips
Börja med att räkna ihop saldot på whiteboard: "+100, +50, -30" = 120. Eventen är operationerna; tillståndet är summan. Det är hela event sourcing.
Visa testet innan du visar implementationen. Given-When-Then-strukturen säljer eventbaserat tänk bättre än något annat.
Var ärlig om kostnaden: schema-evolution är hårt, queries kräver projektioner. Det är inte gratis.
Workshop
- Skapa
IEventStore-interface.
- Implementera
InMemoryEventStore med Dictionary<string, List<StoredEvent>>.
- Skapa
EventSourcedRepository<TAggregate, TId>.
- Spar och ladda
Account via repository.
- Skriv 5 G-W-T-tester mot aggregatet.
Snabba
- Implementera
IUpcaster för en versionerad event. - Skriv test som visar att v1 → v2-upcasting fungerar.
Stöd
- Ge ett skelett av repository med metoder att fylla i.
FAQ
Tar inte rehydrering jättelång tid?
För 50–500 events: nej, det är <10 ms. För >10 000 events: ja, då behövs snapshots (L9).
Får man ändra ett event som redan finns?
Aldrig. Strömmen är immutable. Lägg till ett nytt event som korrigerar, eller upcasta vid läsning.
Hur deletar man data om GDPR kräver det?
Crypto-shredding: kryptera PII per stream med en nyckel, släng nyckeln. Eller separera PII i ett separat sidostore. Stora ämne — ta upp översiktligt.
Vanlig fallgrop Studenter försöker direkt-mutera state inuti business-metoder ("snabbare"). Påminn: business-metoden bestämmer + raises event, Apply muterar. Annars förlorar man rehydrerings-egenskapen.
Hemuppgift Soloprojekt 1 (lektion 05): bygg in-memory ES för ShoppingCart.
Förberedelse till L6 Ha Docker + MSSQL-image redo. Installera SqlStreamStore.MsSql-paketet (V3).
← L4
L6 →