Skip to content

Releases: eQuantic/core-cqs

Release list

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 25 Jul 17:55

3.0.0 (2026-07-25)

⚠ BREAKING CHANGES

  • outbox: IOutboxRepository.MarkFailed takes maxAttempts and
    backoff; IOutbox.Enqueue takes an optional context ahead of the
    cancellation token; IOutboxMessage gains NextAttemptAt and Context.
    Custom implementations of either interface must be updated. Existing data
    survives: the PostgreSQL table picks up its two columns through ADD COLUMN IF NOT EXISTS, while EF Core deployments need a migration for the new
    NextAttemptAt/Context properties and the widened outbox index.

Features

  • outbox: carry context, retry with backoff and claim under lock (319abb9)

v2.5.0

Choose a tag to compare

@github-actions github-actions released this 24 Jul 21:11

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 transaction

Either 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 OutboxDataEntity needs to be part of your native model with a repository registered for it — for example AddPostgreSqlRepository<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