- Tactical Domain Driven Design Patterns (Aggregate Root, Entities, Value Objects, Domain Events, Repository)
- Unit Of Work Pattern & Optimistic Concurrency
- Messaging via NServiceBus
- Outbox Pattern (
NServiceBusOutbox
&HangfireOutbox
) - Integration Tests
Database modification and message publish should happen transactionally. Therefore an Outbox is implemented.
The second transaction requires an outbox implementation which is connected to the subscribing message for deduplication.
Simmilar to UC1 but this time we are not in a htttp context.
- SendLocal prüfen
- Sagas prüfen
- Dapper sql command + transaction
- AggregateConcurrency Exception in einem MediatR Behavior handeln und Polly-Retries auslösen
docker-compose up
- Tests mit Visual Studio ausführen
Web
bietet eine REST API an. Dieses Projekt publiziert Events (bzw. schreibt diese in die Outbox) und abonniert Events vom Bus um SingalR Notifizierungen auszulösen.Worker
ist ein Web API Projekt aber dient als Background Worker. Der Worker Service publiziert und abonniert Events. Zudem werden Hangfire Jobs (wie bspw. die Outbox) vom Worker abgearbeitet.
NServiceBus bietet mit ihrer Outbox bereits eine Lösung für solche Konsiszentprobleme an. Das Problem ist jedoch, dass diese ausschliesslich im Zusammenhand mit einer Inbox funktioniert. Mit aktivieren der Outbox ist also nur die Konsistenz zwischen DB und NSB im Message Handler Kontext (Event -> DB -> Event) gelöst.
Hier einige links dazu:
- https://docs.particular.net/samples/router/update-and-publish/
- https://discuss.particular.net/t/outbox-in-an-asp-net-core-scenario/966/6
Im Moment gibt es mehrere Lösungsansätze:
NServiceBus.Router
ist ein Community Projekt und hat keinen offiziellen NSB support.NServiceBus.Connector.SqlServer
basiert aufNServiceBus.Router
und vereinfacht dessen Handhabunghttps://github.com/peto268/NServiceBus.WebOutbox
NServiceBus.Transport.Bridge
ist eine offiziell supportete NSB Komponente, momentan existiert jedoch nur eine preview Version.- Outbox via Hangfire selbst implementieren