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.

V3 Mån
Vecka / Dag
4 h
Total tid
100 min
Teori
120 min
Workshop

Mål

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).
1:45
Paus 15 min
2:00
Workshop: implementera in-memory store + tester.
3:45
Diskussion: när är event sourcing rätt val? När är det fel?
4:00
Slut

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

  1. Skapa IEventStore-interface.
  2. Implementera InMemoryEventStore med Dictionary<string, List<StoredEvent>>.
  3. Skapa EventSourcedRepository<TAggregate, TId>.
  4. Spar och ladda Account via repository.
  5. 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 →