Examination

Examinationsuppgifter — gruppprojekt & eget bibliotek

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.

Om examinationen

Uppgift 1 — Grupp3–4 personer · ~30 timmar/person · Inlämning V7
Uppgift 2 — Enskild~15 timmar · Inlämning V7
BetygsskalaIG / G / VG
Krav för betygBåda uppgifterna måste vara minst G. För VG i kursen krävs VG på båda.
ExaminationsformSkriftlig inlämning (git-repo) + 20 min muntlig redovisning

Kursplanemål och täckningsmatris

Examinationen mäter följande mål från kursplanen. Varje mål täcks av minst en uppgift.

MålLektionUppg. 1Uppg. 2
Förklara DDD-grunder och bounded contexts02
Designa aggregat med invarianter och Apply-pattern03
Implementera CQRS med MediatR-pipeline04
Persistera och rehydrera via event sourcing05–06
Hantera concurrency, idempotency, transaktioner07
Bygga command-kö och compensating events08
Implementera snapshots och projection-rebuild09✓ (VG)✓ (VG)
Bygga Blazor-klient med optimistic UI och undo10
Skriva enhetstester med Given-When-Then05
Skriva integrationstester med Testcontainers06–07✓ (VG)

Uppgift 1 — Gruppuppgift

Gruppuppgift
TicketHub — biljettbokning end-to-end
Grupp
3–4 personer
Tidsåtgång
~30 h / person
Inlämning
V7, fredag 23:59
Format
Git-repo + ADR + demo
Stack
.NET 10, SqlStreamStore, MSSQL, Blazor WASM

Scenario

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.

Krav på domänen

  • Tre aggregat: Concert, Seat, Booking. Identifiera invarianter och dokumentera dem.
  • Minst 5 olika domänevents (t.ex. ConcertScheduled, SeatReserved, BookingConfirmed, BookingCancelled, SeatReleased).
  • Affärsregler: en plats kan inte bokas av två personer samtidigt; man kan inte boka en plats på ett avlyst event; avbokning är möjlig fram till 24 h före event.

Tekniska krav

  • SqlStreamStore (MsSqlStreamStoreV3) som event store + MSSQL för read models — samma databas.
  • MediatR-pipeline med Logging, Validation och Idempotency.
  • AggregateCommandQueue framför skrivvägen — single-writer per StreamId.
  • Read model-projection som BackgroundService med checkpoint-tabell i samma TransactionScope.
  • Compensating event BookingCancelled + UI-knapp för avbokning.
  • Polly-retry vid ConcurrencyConflictException.
  • Blazor WebAssembly-klient med typed HttpClient och optimistic UI.
  • Minst 10 enhetstester (Given-When-Then) + minst 5 integrationstester (Testcontainers MSSQL).

Leveranser

  • Git-repo med tydlig README.md (köranvisningar, arkitekturdiagram).
  • ADR (Architecture Decision Record) i Markdown — minst 3 beslut motiverade.
  • Demo — 10 min screencast som visar happy path + avbokning + concurrency-konflikt.
  • Muntlig redovisning 20 min med Q&A från läraren.

Bedömningskriterier

KriteriumGVG
Domänmodell3 aggregat med korrekta invarianter+ tydlig ubiquitous language, dokumenterade context-gränser
Event sourcingSkrivning + rehydrering fungerar+ snapshots var N:te event, dokumenterad strategi
ConcurrencyOptimistic concurrency + retry+ Polly med exponential backoff, jitter, max-attempts
ProjectionRead model + checkpoint+ exactly-once via TransactionScope, zero-downtime rebuild
UndoCompensating event finns+ undo-stack i klienten + Ctrl+Z
TesterMinimi-antal uppnått, alla gröna+ >80 % kodtäckning, Testcontainers-baserade integrationstester
DokumentationREADME + ADR+ arkitekturdiagram, sekvensdiagram för minst ett flöde

Uppgift 2 — Enskild uppgift

Enskild uppgift
AggregateRoot<TId> — eget återanvändbart bibliotek
Form
Enskild
Tidsåtgång
~15 h
Inlämning
V7, fredag 23:59
Format
NuGet-paket + sample
Stack
.NET 10, xUnit, FluentAssertions

Scenario

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.

Krav på biblioteket

  • Abstrakt bas-klass AggregateRoot<TId> med Version, UncommittedEvents, Apply-pattern, LoadFromHistory.
  • Interface IDomainEvent med EventId och OccurredAt.
  • Interface IEventStore med LoadAsync och AppendAsync (förväntad version).
  • Generisk EventSourcedRepository<TAggregate, TId>.
  • In-memory referensimplementation av IEventStore för testning.
  • Exception ConcurrencyConflictException.
  • Sample-projekt ShoppingCart som demonstrerar biblioteket: aggregat med AddItem, RemoveItem, Checkout, minst 3 events.
  • NuGet-packade .nupkg-filer (lokalt feed räcker, ingen publicering till nuget.org krävs).
  • Minst 90 % kodtäckning på själva biblioteket (rapport från coverlet).

Leveranser

  • Git-repo med två projekt: YourName.EventSourcing (bibliotek) och YourName.EventSourcing.Sample.ShoppingCart (exempel).
  • README med snabbstart (5 rader kod-exempel).
  • XML-doc-kommentarer på alla publika typer.
  • Coverlet-rapport (kort textsammanfattning räcker).

Bedömningskriterier

KriteriumGVG
API-designPublika typer enligt krav+ inga onödiga publika typer, "pit of success" — svårt att använda fel
Aggregat-basApply + 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)
SampleShoppingCart fungerar+ end-to-end-test mot sample med Given-When-Then
PackagingNuGet-paket byggs+ SqlStreamStore-port som separat paket *.SqlStreamStore
DokumentationREADME + XML-doc+ migration-guide för befintlig CRUD-kod

Gemensamma betygskriterier

BetygInnebörd
IGMinst ett av kraven på G-nivå saknas eller är felaktigt. Kompletteringstillfälle ges enligt skolans rutiner.
GAlla G-krav uppfyllda. Koden kompilerar, tester gröna, leveranser kompletta.
VGSamtliga VG-kriterier uppfyllda i båda uppgifterna. Visar fördjupad förståelse och välmotiverade designval.
Plagiering Kod hämtad från ChatGPT, Copilot eller annat AI-verktyg måste tydligt markeras med kommentar och referens. Stora osynliga blocktransplantationer från GitHub räknas som plagiat. Alla gruppmedlemmar måste kunna förklara varje del av koden vid muntlig redovisning — slumpvis utvald del per medlem.

Resurser och referenser

Testing in .NET — Microsoft Learn
Officiell guide för xUnit, dotnet test och kodtäckning.
learn.microsoft.com/dotnet/core/testing
Docs
Create a NuGet package — Microsoft Learn
Hur du paketerar och versionerar ditt eget bibliotek.
learn.microsoft.com/nuget/create-packages/creating-a-package
Docs
Architecture Decision Records — adr.github.io
Mall och bakgrund för ADR — krav på gruppuppgiften.
adr.github.io
Guide
Testcontainers MSSQL module
Snurra upp riktig SQL Server i integrationstester. Krav för VG på integrationstester.
testcontainers.com/modules/mssql
Docs
Implementing Domain-Driven Design
Vaughn Vernon (Addison-Wesley, 2013). ISBN 978-0321834577. Referensbok för aggregatdesign och bounded contexts.
informit.com/store/implementing-domain-driven-design-9780321834577
Bok

← Föregående: Blazor-klient Nästa: Lektionsplan →