Stratara.EventSourcing.WorkerDefaults
3.1.3
dotnet add package Stratara.EventSourcing.WorkerDefaults --version 3.1.3
NuGet\Install-Package Stratara.EventSourcing.WorkerDefaults -Version 3.1.3
<PackageReference Include="Stratara.EventSourcing.WorkerDefaults" Version="3.1.3" />
<PackageVersion Include="Stratara.EventSourcing.WorkerDefaults" Version="3.1.3" />
<PackageReference Include="Stratara.EventSourcing.WorkerDefaults" />
paket add Stratara.EventSourcing.WorkerDefaults --version 3.1.3
#r "nuget: Stratara.EventSourcing.WorkerDefaults, 3.1.3"
#:package Stratara.EventSourcing.WorkerDefaults@3.1.3
#addin nuget:?package=Stratara.EventSourcing.WorkerDefaults&version=3.1.3
#tool nuget:?package=Stratara.EventSourcing.WorkerDefaults&version=3.1.3
Stratara.EventSourcing.WorkerDefaults
License: FSL-1.1-MIT (Functional Source License — source-available; converts to MIT after 2 years). Not OSI-approved OSS.
One-stop IHostApplicationBuilder composites that wire together the Stratara event-sourced stack for each host shape (API, command worker, event-projection worker, saga worker, event-stream-hash worker, outbox worker). Reference this package from each host instead of repeating the per-concern DI call chain.
What's in the box
| Composite | Wires |
|---|---|
AddBackendServices |
Common framework services (messaging, identity, session, security, mapping, resilience) + mediator + write store + outbox dispatcher. For API hosts that dispatch commands but don't process them. |
AddCommandWorkerServices |
Common + mediator + mediator-worker (hosted service that consumes the command topic into the in-process mediator) + write store + event sourcing + outbox dispatcher. |
AddEventProjectionWorkerServices |
Common + write store + projection-replay state + projection worker. |
AddSagaWorkerServices |
Common + write store + event sourcing + outbox dispatcher + saga worker. |
AddEventStreamHashWorkerServices |
Common + write store + event-stream-hashing worker. |
AddOutboxWorkerServices |
Common + write store + outbox dispatcher + outbox-retry worker. |
The composites live in the Microsoft.Extensions.Hosting namespace so call sites read naturally:
// Command-handling worker host:
builder.AddCommandWorkerServices();
// API host that only dispatches commands:
builder.AddBackendServices();
Dependencies
This package pulls the framework's Tier-C pieces (Stratara.Infrastructure, Stratara.Outbox.RabbitMQ, Stratara.Projections, Stratara.Sagas, Stratara.EventSourcing.EntityFrameworkCore) so a single PackageReference is enough for a worker host. The lean Stratara.ServiceDefaults (OTel + Serilog) and Stratara.ServiceDefaults.AspNetCore (health-check endpoints + ASP.NET OTel) stay separate so non-worker hosts don't drag the Tier-C runtime in.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Stratara.EventSourcing.EntityFrameworkCore (>= 3.1.3)
- Stratara.Infrastructure (>= 3.1.3)
- Stratara.Outbox.RabbitMQ (>= 3.1.3)
- Stratara.Projections (>= 3.1.3)
- Stratara.Sagas (>= 3.1.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
### Added
- **Mediator tenant-isolation behavior** (`Stratara.Mediator`) — `AddStrataraTenantIsolation()`
registers a pipeline behavior that enforces tenant isolation at the mediator entrance, before the
handler runs, for any request that opts in via the new `ITenantScopedRequest` marker
(`Stratara.Abstractions.Multitenancy`). The behavior compares the request's `TenantId` (data owner)
against the ambient session's data-owner tenant and rejects a mismatch with the new
`TenantAccessDeniedException` (translated to HTTP 403 on ASP.NET hosts). `TenantIsolationMode.Default`
enforces only the subject match (privileged cross-tenant operations pass when the endpoint promoted
the session subject to the target); `TenantIsolationMode.Strict` additionally routes every
cross-tenant operation through the new `ICrossTenantAuthorizer`, whose shipped default denies all
cross-tenant access until a consumer registers its own authorizer. Complements the existing
database-side `ApplyGlobalTenantQueryFilters` with a command-/query-entrance guard. New log-event
IDs `114_101`/`114_102`/`114_003` in `Stratara.Diagnostics`.
- **`Stratara.Abstractions.Persistence.ConcurrencyConflictException`** — provider-agnostic
wrapper for an optimistic-concurrency conflict detected during commit. Allows framework-level
code in `Stratara.Projections` (and any consumer outside the `EntityFrameworkCore` package) to
react to concurrency without taking an EF Core dependency. EF Core's `DbUpdateConcurrencyException`
(and provider equivalents) flow through this type.
### Changed
- **`EfTransaction.SaveChangesAsync`** (in `Stratara.EventSourcing.EntityFrameworkCore`) now
wraps `DbUpdateConcurrencyException` thrown by EF Core in the new
`ConcurrencyConflictException`. PostgreSQL unique-violation paths remain on `DbUpdateException`
(different semantics — duplicate-key on insert vs. stale-row on update/delete).
- **`EventSource.SaveChangesAsync`** (write-side append flow) extends its concurrency-handling
catch to the new exception type so the existing append-conflict recovery path keeps working
after the wrap. Behaviour for both EF concurrency conflicts and PostgreSQL unique violations
is unchanged.
### Fixed
- **`TenantProjection` no longer aborts the event bundle on a parallel delete race.** The two
delete handlers (`TenantDeleted`, `CustomerTenantsDeleted`) now swallow
`ConcurrencyConflictException` silently — a missing row is the desired end-state of a delete.
Before this fix, a consumer-side customer-delete cascade saga that emits both
`CustomerTenantsDeleted` and a follow-up `TenantDeleted` for the same tenants would race the
two parallel projection bundles on the same `TenantView` row; the loser threw
`DbUpdateConcurrencyException` out of `SaveChangesAsync`, which propagated through
`ProjectionWorker` and caused `RabbitMqBus` to roll back the entire bundle — including
sibling projections that had already committed. Update handlers (rename / activate /
deactivate / locale / customer-assigned) keep their current behaviour: a concurrency failure
there is a real race that propagates.