What it does
Outbox-first publishing
Messages are written to the outbox table atomically with your business data. No direct broker publish path — the transactional guarantee is never optional.
Type-safe routing
IEvent fans out to all subscribers. ICommand routes point-to-point to exactly one handler. The compiler and DI container enforce the distinction at startup.
Saga orchestration
Stateful orchestrated sagas with timeouts and compensation. Or keep it simple with choreography-style ISagaParticipant for event-driven workflows.
DDD aggregate support
Extend AggregateRoot, call RaiseDomainEvent, and SaveChanges does the rest. The DomainEventInterceptor harvests and outboxes events in one transaction.
Transport-agnostic
Swap between Azure Service Bus and RabbitMQ with a single DI registration change. Handler, aggregate, and saga code is identical for both transports.
Aspire-ready & observable
One-line AppHost extensions for local development. Structured logging, distributed tracing, and metrics via standard .NET OpenTelemetry APIs.
NuGet packages
Install only what you need. All packages are available on nuget.org.
OpinionatedEventingRuntime hosting, DI extensions, and messaging contextOpinionatedEventing.AbstractionsPure contracts — IEvent, ICommand, IPublisher, AggregateRootOpinionatedEventing.OutboxOutbox dispatcher background serviceOpinionatedEventing.SagasSaga orchestration and choreography engineOpinionatedEventing.EntityFrameworkEF Core outbox store and domain event interceptorOpinionatedEventing.TestingIn-memory stores and fakes for unit testsOpinionatedEventing.AzureServiceBusAzure Service Bus transportOpinionatedEventing.RabbitMQRabbitMQ transport with Aspire service discoveryOpinionatedEventing.Aspire.AzureServiceBusAspire AppHost extension for the ASB emulatorOpinionatedEventing.Aspire.RabbitMQAspire AppHost extension for RabbitMQOpinionatedEventing.OpenTelemetryDistributed tracing and metrics instrumentation