Laboratorium 5: Wprowadzenie do Domain Driven Design (DDD) oraz Command Query Responsibility Segregation (CQRS)
Celem tego laboratorium jest praktyczne zapoznanie się z kluczowymi aspektami Domain Driven Design (DDD) oraz podstawami Command Query Responsibility Segregation (CQRS). Przed rozpoczęciem, zapoznaj się z dostępnym kodem. W razie pytań, skontaktuj się przez platformę Teams.
- Oddziel warstwy: domenową, aplikacji oraz infrastruktury. W tym projekcie, dla uproszczenia, modele domeny i infrastruktury są identyczne.
- Staraj się stosować zasady SOLID przy projektowaniu klas.
- Projekt uruchamia się pod adresem
http://localhost:8080
. - Do połączenia z bazą danych użyj narzędzia Studio3T. Wymagany connection string to:
mongodb://root:example@localhost:27017
. - Podczas instalacji Visual Studio upewnij się, że masz pakiet ASP.NET and Web Development.
- Utwórz klona tego repozytorium, co ułatwi integrację ewentualnych poprawek.
- Dodanie zamówienia (POST /api/v1/customers/{customerId}/orders)
customerId
: 3fa85f64-5717-4562-b3fc-2c963f66afa6- Produkt
id
pochodzi zProductPriceDataApi
.
{ "products": [ { "id": "514f6265-a9b8-46da-a31d-50f4f4c20911", "quantity": 1 } ] }
- Pobranie zamówienia (GET /api/v1/customers/{customerId}/orders/{orderId})
orderId
: Wartość zwrócona przez zapytanie POST.
Uwaga: Z powodów technicznych (serializacja) wszystkie właściwości modeli domenowych muszą mieć settery i gettery, np. public Guid Id { get; private set; }
.
Zaimplementuj funkcjonalność tworzenia nowych użytkowników przy użyciu agregatu Customer
.
- Utwórz klasy
CreateCustomerCommand
iGetCustomerQuery
. - Zaimplementuj obsługę tych komend i zapytań.
- Dodaj odpowiednie endpointy do API.
- Po stworzeniu klienta wygeneruj zdarzenie
CustomerCreatedEvent
.
Pamiętaj: Utwórz nową kolekcję dla użytkowników w bazie danych oraz upewnij się, że do warstwy API nie dostaną się modele domenowe.
Stwórz następujące reguły biznesowe:
- Nazwa użytkownika nie może być pusta i powinna składać się wyłącznie z liter.
- Łączny koszt produktów w zamówieniu nie może przekroczyć 15 000.
Aby aplikacja była stabilniejsza i zapewniała odpowiedni monitoring, wprowadź:
- Obsługę błędów za pomocą dedykowanego middleware, który przechwyci wyjątki i zwróci przyjazne komunikaty.
- Obsługę metryk do monitorowania stabilności systemu poprzez śledzenie wystąpień błędów.
- Rozszerz klasę
ErrorHandlingMiddleware
, odpowiedzialną za przechwytywanie wyjątków. - Middleware powinien zwracać informację z przyjaznym komunikatem błędu.
- Stwórz
MetricsService
, który będzie odpowiedzialny za zliczanie błędów. - Udostępnij metryki pod adresem
/metrics
.
Zaimplementuj funkcjonalność obsługi koszyka produktów.
- Stwórz agregat do zarządzania koszykiem produktów.
- Dodaj komendy (commands) i zapytania (queries) dla zarządzania koszykiem:
- Umożliw dodawanie produktów do koszyka.
- Opcjonalnie: możliwość usuwania produktów z koszyka jest opcjonalna i może zostać pominięta.
- Dodaj możliwość pobierania zawartości koszyka.
- Dodaj odpowiednie endpointy do API.
- Zmień implementację
Order
, aby była tworzona za pomocą metodypublic static Order Create(CheckoutCart checkoutCart)
.
Uwaga: Utwórz nową kolekcję dla koszyka produktów w bazie danych.