Releases: eQuantic/core-cqs
Release list
v3.0.0
3.0.0 (2026-07-25)
⚠ BREAKING CHANGES
- outbox:
IOutboxRepository.MarkFailedtakesmaxAttemptsand
backoff;IOutbox.Enqueuetakes an optionalcontextahead of the
cancellation token;IOutboxMessagegainsNextAttemptAtandContext.
Custom implementations of either interface must be updated. Existing data
survives: the PostgreSQL table picks up its two columns throughADD COLUMN IF NOT EXISTS, while EF Core deployments need a migration for the new
NextAttemptAt/Contextproperties and the widened outbox index.
Features
- outbox: carry context, retry with backoff and claim under lock (319abb9)
v2.5.0
v2.5.0 — the transactional outbox, on the native engine
📦 eQuantic.Core.CQS.Data
A new package: the eQuantic.Core.Data implementation of the outbox — no ORM in the path.
What makes it different from the other providers is when it writes. Add stages the message on the ambient unit of work instead of committing it, so the outbox row lands in the same transaction as the aggregate that raised the event:
options.UseCoreDataOutbox();await orders.AddAsync(order); // the aggregate's DataModel, staged
await unitOfWork.CommitAsync(); // aggregate + its outbox messages — one transactionEither both persist or neither does, so no event is lost to a crash between "saved the aggregate" and "published the event" — and that holds on every store the engine supports: PostgreSQL, MySQL, SQL Server, MongoDB, Cosmos DB and Cassandra.
The relay side (GetPending, MarkProcessed, MarkFailed, CleanupProcessed) runs as server-side set-based statements: no row is loaded to change its state.
The
OutboxDataEntityneeds to be part of your native model with a repository registered for it — for exampleAddPostgreSqlRepository<OutboxDataEntity, Guid>().
👷 The release pipeline is now semantic-release
Standardized to match the rest of the ecosystem: the version comes from the commit history, and a release updates CHANGELOG.md and a single src/Directory.Build.props version, packs every src package, publishes to NuGet.org and GitHub Packages, then tags. GitVersion is gone, and CI on branches is now build + test + a smoke pack.
🐛 Container fixtures no longer stall a run
The PostgreSQL, MongoDB and Redis fixtures started a container regardless of whether the agent could run one. An xUnit collection fixture initializes even when every test in it is skipped, so on an agent without Linux containers the run waited for something that would never arrive. The fixtures now check for a Linux-container daemon first, bound the startup wait, and stand down cleanly when there is nothing to talk to — the tests simply report as skipped.
Full changelog: v2.4.0...v2.5.0