How shadowjac/outbox-pattern-poc works
OutboxPoc is a .NET order API and background event-delivery PoC. A client submits or lists orders; order creation stores the order and its serialized event together, then a polling processor publishes pending events and marks them processed. A Kafka consumer logs received events. PostgreSQL, Kafka, and Aspire orchestration are documented capabilities; source excerpts show the API and consumer wiring, but not all runtime configuration details. The publisher implementations are distinct; the excerpts do not establish which registration is ultimately selected at runtime.
Main entry points: Program.cs API startup · AppDbContext.cs EF data context · AppHost.cs Aspire AppHost · OrderEndpoints.cs Order endpoints
Components 16
Order API
- Order endpoints
src/OutboxPoc.Api/Endpoints/OrderEndpoints.cs - Order model
src/OutboxPoc.Api/Domain/Order.cs - EF data context
src/OutboxPoc.Api/Infrastructure/AppDbContext.cs
Outbox Delivery
- Outbox message
src/OutboxPoc.Api/Domain/OutboxMessage.cs - Outbox processor
src/OutboxPoc.Api/Outbox/OutboxProcessor.cs - Publisher interface
src/OutboxPoc.Api/Outbox/IMessagePublisher.cs - Kafka publisher
src/OutboxPoc.Api/Outbox/KafkaMessagePublisher.cs - Log publisher
src/OutboxPoc.Api/Outbox/LogMessagePublisher.cs
Event Consumer
- Consumer worker
src/OutboxPoc.Consumer/Worker.cs
Runtime Services
- PostgreSQL
- Kafka orders topic
- API startup
src/OutboxPoc.Api/Program.cs - Consumer startup
src/OutboxPoc.Consumer/Program.cs - Aspire AppHost
src/OutboxPoc.AppHost/AppHost.cs - Service defaults
src/OutboxPoc.ServiceDefaults/Extensions.cs
Other components
- HTTP client
Connections 25
- HTTP client → Order endpoints: sends HTTP
README.md - Order endpoints → EF data context: saves and lists
src/OutboxPoc.Api/Endpoints/OrderEndpoints.cs - Order endpoints → Order model: creates
src/OutboxPoc.Api/Endpoints/OrderEndpoints.cs - Order endpoints → Outbox message: records event
src/OutboxPoc.Api/Endpoints/OrderEndpoints.cs - EF data context → Order model: maps entity
src/OutboxPoc.Api/Infrastructure/AppDbContext.cs - EF data context → Outbox message: maps entity
src/OutboxPoc.Api/Infrastructure/AppDbContext.cs - EF data context → PostgreSQL: persists data
README.md - Outbox processor → EF data context: loads and marks
src/OutboxPoc.Api/Outbox/OutboxProcessor.cs - Outbox processor → Publisher interface: publishes through
src/OutboxPoc.Api/Outbox/OutboxProcessor.cs - Publisher interface → Outbox message: accepts message
src/OutboxPoc.Api/Outbox/IMessagePublisher.cs - Kafka publisher → Publisher interface: implements
src/OutboxPoc.Api/Outbox/KafkaMessagePublisher.cs - Log publisher → Publisher interface: implements
src/OutboxPoc.Api/Outbox/LogMessagePublisher.cs - Kafka publisher → Kafka orders topic: produces events
src/OutboxPoc.Api/Outbox/KafkaMessagePublisher.cs - Consumer startup → Consumer worker: registers worker
src/OutboxPoc.Consumer/Program.cs - Consumer worker → Kafka orders topic: consumes events
README.md - API startup → EF data context: configures database
src/OutboxPoc.Api/Program.cs - API startup → Outbox processor: registers processor
src/OutboxPoc.Api/Program.cs - API startup → Kafka publisher: registers publisher
src/OutboxPoc.Api/Program.cs - API startup → Log publisher: registers publisher
src/OutboxPoc.Api/Program.cs - API startup → Service defaults: adds defaults
src/OutboxPoc.Api/Program.cs - Consumer startup → Service defaults: adds defaults
src/OutboxPoc.Consumer/Program.cs - Aspire AppHost → API startup: orchestrates
README.md - Aspire AppHost → Consumer startup: orchestrates
README.md - Aspire AppHost → PostgreSQL: starts resource
README.md - Aspire AppHost → Kafka orders topic: starts resource
README.md