ZeroAlloc.Outbox 0.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package ZeroAlloc.Outbox --version 0.1.0
                    
NuGet\Install-Package ZeroAlloc.Outbox -Version 0.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ZeroAlloc.Outbox" Version="0.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ZeroAlloc.Outbox" Version="0.1.0" />
                    
Directory.Packages.props
<PackageReference Include="ZeroAlloc.Outbox" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add ZeroAlloc.Outbox --version 0.1.0
                    
#r "nuget: ZeroAlloc.Outbox, 0.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package ZeroAlloc.Outbox@0.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=ZeroAlloc.Outbox&version=0.1.0
                    
Install as a Cake Addin
#tool nuget:?package=ZeroAlloc.Outbox&version=0.1.0
                    
Install as a Cake Tool

ZeroAlloc.Outbox

Source-generated transactional outbox for .NET. Annotate a message type with [OutboxMessage] and a Roslyn source generator emits a typed writer and dispatcher bridge — no reflection, no boxing, AOT-safe. Backed by EF Core (production) or in-memory (tests), with a built-in polling worker, exponential-backoff retry, and dead-letter support.

NuGet NuGet NuGet NuGet Build License: MIT


Install

# Core abstractions + source generator (always required)
dotnet add package ZeroAlloc.Outbox
dotnet add package ZeroAlloc.Outbox.Generator

# Pick a store:
dotnet add package ZeroAlloc.Outbox.EfCore    # production — Entity Framework Core
dotnet add package ZeroAlloc.Outbox.InMemory  # testing — in-process, no database

Quick start

1. Annotate your message:

using ZeroAlloc.Outbox;

[OutboxMessage]
public sealed record OrderPlaced(int OrderId, decimal Amount);

The generator emits IOutboxWriter<OrderPlaced> and its DI registration extension.

2. Register with DI:

builder.Services.AddOutbox(options =>
{
    options.PollingInterval = TimeSpan.FromSeconds(5);
    options.BatchSize       = 50;
    options.MaxAttempts     = 3;
});

builder.Services.AddOutboxEfCore<AppDbContext>();  // or AddOutboxInMemory()
builder.Services.AddOrderPlacedOutbox();           // generated extension

3. Write in a transaction:

public class OrderService(IOutboxWriter<OrderPlaced> writer, AppDbContext db)
{
    public async Task PlaceOrderAsync(Order order, CancellationToken ct)
    {
        db.Orders.Add(order);
        await db.SaveChangesAsync(ct);
        await writer.WriteAsync(new OrderPlaced(order.Id, order.Total), ct: ct);
    }
}

For atomic writes (both or neither commit), pass the DbTransaction explicitly. See EF Core Transaction.

4. Implement a dispatcher:

public class OrderPlacedDispatcher(IMessageBus bus) : IOutboxDispatcher<OrderPlaced>
{
    public async Task DispatchAsync(OrderPlaced message, CancellationToken ct)
        => await bus.PublishAsync(message, ct);
}

// Register the dispatcher
builder.Services.AddTransient<IOutboxDispatcher<OrderPlaced>, OrderPlacedDispatcher>();

Features

Feature Notes
Source-generated writers [OutboxMessage] triggers generator; typed IOutboxWriter<T> emitted at compile time
Typed dispatchers IOutboxDispatcher<T> — implement once, wire to any transport (bus, HTTP, email)
EF Core store Writes and reads via DbContext; enlist in ambient transaction for atomicity
InMemory store Thread-safe in-process store for unit and integration tests
Polling worker OutboxWorkerService (IHostedService) polls on configurable interval with scope isolation
Exponential backoff Retry delay = RetryBaseDelay × 2^(attempt-1); configurable via OutboxOptions
Dead-letter Entries that exceed MaxAttempts are dead-lettered with the failure reason
AOT / trimmer safe All dispatch code is generated; no Type.GetType, no MakeGenericType
IOptions<OutboxOptions> Full options support with hot-reload via standard Microsoft.Extensions.Options

Diagnostics

ID Severity Description
ZO0001 Warning [OutboxMessage] applied to an interface — code will not be generated
ZO0002 Warning [OutboxMessage] applied to a static class — code will not be generated
ZO0003 Warning [OutboxMessage] applied to a nested type — use a top-level type for a stable type discriminator

Documentation

Full docs live in docs/:


License

MIT

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (9)

Showing the top 5 NuGet packages that depend on ZeroAlloc.Outbox:

Package Downloads
ZeroAlloc.Outbox.EfCore

EF Core store adapter for ZeroAlloc.Outbox.

ZeroAlloc.Scheduling.EfCore

EF Core job store adapter for ZeroAlloc.Scheduling.

ZeroAlloc.Outbox.InMemory

In-memory store adapter for ZeroAlloc.Outbox (testing).

ZeroAlloc.Outbox.Telemetry

ZeroAlloc.Telemetry bridge for ZeroAlloc.Outbox — wraps IOutboxTypeDispatcher with a source-generated OpenTelemetry proxy.

ZeroAlloc.Outbox.Dashboard

Operations dashboard for ZeroAlloc.Outbox. Minimal API + SSE + embedded HTML.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.5.0 634 5/14/2026
2.4.1 278 5/12/2026
2.4.0 588 5/4/2026
2.3.1 230 5/3/2026
2.3.0 211 5/1/2026
2.2.1 213 4/28/2026
2.2.0 137 4/28/2026
2.1.1 126 4/28/2026
2.1.0 143 4/26/2026
2.0.0 136 4/25/2026
1.3.0 139 4/25/2026
1.2.2 153 4/25/2026
1.2.1 559 4/24/2026
1.2.0 135 4/24/2026
1.1.2 141 4/23/2026
1.1.1 143 4/23/2026
1.1.0 141 4/22/2026
1.0.1 139 4/22/2026
1.0.0 146 4/20/2026
0.1.0 139 4/20/2026