finds.dev← search

// the find

mizrael/SuperSafeBank

★ 589 · C# · updated Jan 2025

Sample Event Sourcing implementation with .NET Core

A teaching repo that walks through Event Sourcing + CQRS + DDD in .NET Core using a toy banking domain. It ships multiple interchangeable persistence backends (EventStore, SQL Server, CosmosDB, EvenireDB) and transport backends (Kafka, Azure Service Bus), which makes it useful as a reference for comparing approaches. Aimed at .NET developers who want to see these patterns wired together end-to-end rather than described abstractly.

The persistence and transport layers are properly abstracted behind interfaces, so you can swap CosmosDB for SQL Server without touching domain code — that abstraction is actually clean, not just claimed. The domain model is honest: `Account` and `Customer` are proper aggregates that raise events internally, not anemic data bags. Integration tests exist for each persistence backend and actually hit real infrastructure via Docker, which is the right call. The docker-compose setup means you can spin up the full on-premise stack in one command.

Last meaningful commit was January 2025 and the Azure Functions project still targets an older isolated worker pattern — if you copy this for a real project, check that the Function SDK versions aren't stale. Concurrency is a known hard problem in event sourcing and this repo punts on it entirely: no optimistic concurrency on append, no version checks, no conflict resolution. The `FakeCurrencyConverter` and `FakeNotificationsService` in the domain and worker layers are fine for demos but left in production paths with no indication of what a real implementation would look like. Event schema versioning (upcasting, migrating old events) is completely absent — fine for a sample, but that's where real event-sourced systems get painful and the repo gives you no guidance.

View on GitHub → Homepage ↗

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →