Skip to main content
net10.0net8.0

Pipeline behavior that applies [MediatorRetry], [MediatorCircuitBreaker], and [MediatorTimeout] declared on request types. Composes ZeroAlloc.Resilience policies directly in the Mediator pipeline β€” no source generation required at the call site.

Published
Aug 7, 2026
2mo ago
Total Downloads
1.9K
1,912

Install

dotnet add package ZeroAlloc.Mediator.Resilience --version 5.0.0
ProductVersions
.NET
net10.0net8.0

README

ZeroAlloc.Mediator

NuGet Build License: MIT AOT GitHub Sponsors

ZeroAlloc.Mediator is a source-generated, zero-allocation mediator for .NET 8 and .NET 10. It supports request/response, notifications, and streaming without reflection or dynamic dispatch. The source generator eliminates the runtime overhead that reflection-based mediators incur by wiring all dispatch at compile time β€” no dictionaries, no virtual dispatch, no delegate allocation per request.

Install

dotnet add package ZeroAlloc.Mediator

The generator package must also be added as an analyzer:

<PackageReference Include="ZeroAlloc.Mediator.Generator" Version="*" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />

Example

// 1. Define a request record and its expected response type
public readonly record struct CreateOrder(string Product, int Qty) : IRequest<OrderId>;

// 2. Implement a handler β€” no constructor dependencies needed for this example
public class CreateOrderHandler : IRequestHandler<CreateOrder, OrderId>
{
    public ValueTask<OrderId> Handle(CreateOrder request, CancellationToken ct)
        => ValueTask.FromResult(OrderId.NewId());
}

// 3. Register IMediator with DI (the generator emits services.AddMediator() automatically)
services.AddMediator();

// 4. Send the request and use the result β€” fully strongly-typed, zero allocation
app.MapPost("/orders", async (CreateOrder cmd, IMediator mediator, CancellationToken ct) =>
{
    var id = await mediator.Send(cmd, ct);   // returns OrderId, no boxing
    return Results.Created($"/orders/{id}", id);
});

IMediator is generated into your assembly and is internal, so it cannot appear in a public signature. Endpoint lambdas and internal services are unaffected; see Visibility for the reasoning and the pattern for MVC controllers.

Performance

ZeroAlloc.Mediator is 40–160x faster than MediatR with zero heap allocation on all non-streaming paths (.NET 10.0.4, i9-12900HK, BenchmarkDotNet).

Operation ZeroAlloc.Mediator MediatR Speedup Alloc
Send 0.5 ns 78.3 ns ~160x 0 B vs 224 B
Send + pipeline 2.8 ns 101.8 ns ~46x 0 B vs 152 B
Send (via IMediator DI) 5.8 ns 86.3 ns ~15x 0 B vs 224 B
Publish (1 handler) 6.1 ns 243.8 ns ~40x 0 B vs 792 B
Publish (multi handler) 6.6 ns 332.4 ns ~51x 0 B vs 1,032 B
Stream (5 items) 202.8 ns 654.4 ns ~3x 104 B vs 528 B

The 104 B on the Stream row is the C# compiler's async IAsyncEnumerable<T> state machine for your handler method β€” every mediator dispatching to such handlers pays this; ZA.Mediator's own stream-dispatch contribution is 0 B. See docs/performance.md for the full benchmark table and zero-allocation design explanation.

Features

  • Request/Response β€” strongly-typed Send overloads per request type
  • Notifications β€” sequential or parallel ([ParallelNotification]) dispatch
  • Streaming β€” IAsyncEnumerable<T> via CreateStream
  • Pipeline Behaviors β€” compile-time inlined middleware chain (logging, validation, etc.)
  • Bridge Packages β€” WithCache(), WithValidation(), WithResilience(), WithTelemetry() (OpenTelemetry spans + metrics on IRequest<T>.Send), WithAuthorization() ([Authorize]-gated dispatch via ZeroAlloc.Authorization policies)
  • Polymorphic Notifications β€” base interface handlers are automatically included in concrete notification dispatch
  • Analyzer Diagnostics β€” missing handlers, duplicates, and misconfigurations are build errors/warnings
  • Zero Allocation β€” ValueTask, readonly record struct, static dispatch, no closures
  • Native AOT Compatible β€” no reflection at runtime; all dispatch is resolved at compile time by the source generator

Documentation

Page Description
Getting Started Install and send your first request in five minutes
Requests & Handlers Commands, queries, Unit responses, dispatch
Notifications Events: sequential, parallel, polymorphic handlers
Streaming IAsyncEnumerable<T> for large result sets
Pipeline Behaviors Compile-time middleware: logging, validation, caching
Authorization [Authorize]-gated dispatch via ZeroAlloc.Authorization policies
Dependency Injection DI containers, IMediator, factory delegates
Diagnostics ZAM001–ZAM007 compiler error reference with fixes
Performance Zero-alloc internals, benchmark results, Native AOT
Advanced Patterns Error handling, cancellation, scoped behaviors
Testing Unit-test handlers, behaviors, and notifications

License

MIT

Changes from Previous Version

No structural changes between v4.1.4 and v5.0.0.

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

Compatibility metadata lists 2 target frameworks; confirm the exact target used by your application.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.