Kursen examineras genom två obligatoriska uppgifter: ett grupparbete där ni bygger en komplett event-sourced applikation, och ett enskilt arbete där du paketerar din egen återanvändbara AggregateRoot<TId>-grund som ett bibliotek.
| Uppgift 1 — Grupp | 3–4 personer · ~30 timmar/person · Inlämning V7 |
| Uppgift 2 — Enskild | ~15 timmar · Inlämning V7 |
| Betygsskala | IG / G / VG |
| Krav för betyg | Båda uppgifterna måste vara minst G. För VG i kursen krävs VG på båda. |
| Examinationsform | Skriftlig inlämning (git-repo) + 20 min muntlig redovisning |
Examinationen mäter följande mål från kursplanen. Varje mål täcks av minst en uppgift.
| Mål | Lektion | Uppg. 1 | Uppg. 2 |
|---|---|---|---|
| Förklara DDD-grunder och bounded contexts | 02 | ✓ | |
| Designa aggregat med invarianter och Apply-pattern | 03 | ✓ | ✓ |
| Implementera CQRS med MediatR-pipeline | 04 | ✓ | |
| Persistera och rehydrera via event sourcing | 05–06 | ✓ | ✓ |
| Hantera concurrency, idempotency, transaktioner | 07 | ✓ | |
| Bygga command-kö och compensating events | 08 | ✓ | |
| Implementera snapshots och projection-rebuild | 09 | ✓ (VG) | ✓ (VG) |
| Bygga Blazor-klient med optimistic UI och undo | 10 | ✓ | |
| Skriva enhetstester med Given-When-Then | 05 | ✓ | ✓ |
| Skriva integrationstester med Testcontainers | 06–07 | ✓ | ✓ (VG) |
Ni bygger TicketHub, ett system för biljettbokning till konserter. Användare ska kunna se konserter, välja platser, boka och betala. Bokningar kan avbokas och avbokade platser blir tillgängliga igen.
Concert, Seat, Booking. Identifiera invarianter och dokumentera dem.ConcertScheduled, SeatReserved, BookingConfirmed, BookingCancelled, SeatReleased).MsSqlStreamStoreV3) som event store + MSSQL för read models — samma databas.AggregateCommandQueue framför skrivvägen — single-writer per StreamId.BackgroundService med checkpoint-tabell i samma TransactionScope.BookingCancelled + UI-knapp för avbokning.ConcurrencyConflictException.HttpClient och optimistic UI.README.md (köranvisningar, arkitekturdiagram).| Kriterium | G | VG |
|---|---|---|
| Domänmodell | 3 aggregat med korrekta invarianter | + tydlig ubiquitous language, dokumenterade context-gränser |
| Event sourcing | Skrivning + rehydrering fungerar | + snapshots var N:te event, dokumenterad strategi |
| Concurrency | Optimistic concurrency + retry | + Polly med exponential backoff, jitter, max-attempts |
| Projection | Read model + checkpoint | + exactly-once via TransactionScope, zero-downtime rebuild |
| Undo | Compensating event finns | + undo-stack i klienten + Ctrl+Z |
| Tester | Minimi-antal uppnått, alla gröna | + >80 % kodtäckning, Testcontainers-baserade integrationstester |
| Dokumentation | README + ADR | + arkitekturdiagram, sekvensdiagram för minst ett flöde |
Du paketerar de grundpelare som varje event-sourced applikation behöver i ett återanvändbart bibliotek. Ditt bibliotek ska kunna släppas som NuGet-paket och användas av framtida projekt — inklusive ditt eget gruppprojekt om ni vill.
AggregateRoot<TId> med Version, UncommittedEvents, Apply-pattern, LoadFromHistory.IDomainEvent med EventId och OccurredAt.IEventStore med LoadAsync och AppendAsync (förväntad version).EventSourcedRepository<TAggregate, TId>.IEventStore för testning.ConcurrencyConflictException.ShoppingCart som demonstrerar biblioteket: aggregat med AddItem, RemoveItem, Checkout, minst 3 events..nupkg-filer (lokalt feed räcker, ingen publicering till nuget.org krävs).coverlet).YourName.EventSourcing (bibliotek) och YourName.EventSourcing.Sample.ShoppingCart (exempel).| Kriterium | G | VG |
|---|---|---|
| API-design | Publika typer enligt krav | + inga onödiga publika typer, "pit of success" — svårt att använda fel |
| Aggregat-bas | Apply + version + uncommitted fungerar | + stöd för ISnapshotable<T>-mönster |
| Tester | ≥ 70 % täckning, alla gröna | ≥ 90 % täckning + property-based test (FsCheck) |
| Sample | ShoppingCart fungerar | + end-to-end-test mot sample med Given-When-Then |
| Packaging | NuGet-paket byggs | + SqlStreamStore-port som separat paket *.SqlStreamStore |
| Dokumentation | README + XML-doc | + migration-guide för befintlig CRUD-kod |
| Betyg | Innebörd |
|---|---|
| IG | Minst ett av kraven på G-nivå saknas eller är felaktigt. Kompletteringstillfälle ges enligt skolans rutiner. |
| G | Alla G-krav uppfyllda. Koden kompilerar, tester gröna, leveranser kompletta. |
| VG | Samtliga VG-kriterier uppfyllda i båda uppgifterna. Visar fördjupad förståelse och välmotiverade designval. |