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
Oct 16, 2026
6d ago
Total Downloads
1.9K
1,912

Install

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

README

ZeroAlloc.Mediator

NuGet Build License: MIT AOT GitHub Sponsors

A source-generated MediatR alternative for .NET 8 and .NET 10: requests, notifications and streams dispatched without reflection, with no allocations on the Send and Publish hot path, ready for NativeAOT.

Why ZeroAlloc.Mediator

  • 0 B per Send and Publish. The static Mediator path, pipeline behaviors included, is held at zero bytes by AllocationGate tests. MediatR allocates 224 B per Send and 792 B per single-handler Publish in the same benchmark.
  • 36–160x faster than MediatR on Send and Publish in the same BenchmarkDotNet run. Through IMediator resolved from a new scope per call, the way an ASP.NET Core request does, it is still 1.2–1.5x faster and allocates 176 B against MediatR's 352–496 B.
  • Works under NativeAOT and trimming. Dispatch is a generated, strongly-typed overload per request type: no reflection, no dictionary lookup, no handler scanning at startup. CI publishes and runs a NativeAOT sample on every build.
  • Mistakes fail the build, not the request. A request with no handler, two handlers for one request or a misconfigured behavior is reported by the generator as a compiler diagnostic.

Install

dotnet add package ZeroAlloc.Mediator
dotnet add package ZeroAlloc.Mediator.Generator

The second package is the source generator; it is added as a private development dependency. See Getting Started for multi-project solutions.

Quick start

using ZeroAlloc.Mediator;

decimal total = await Mediator.Send(new AddToCart(Quantity: 3, UnitPrice: 9.99m));
Console.WriteLine(total); // 29.97

public readonly record struct AddToCart(int Quantity, decimal UnitPrice) : IRequest<decimal>;

public sealed class AddToCartHandler : IRequestHandler<AddToCart, decimal>
{
    public ValueTask<decimal> Handle(AddToCart request, CancellationToken ct)
        => ValueTask.FromResult(request.Quantity * request.UnitPrice);
}

Mediator.Send(AddToCart) is an overload the generator wrote for this request, so the call is checked by the compiler and dispatches straight to the handler. In an ASP.NET Core app, call builder.Services.AddMediator() and inject IMediator; see Dependency Injection.

What you get

  • Requests and responses: commands and queries with a typed response, or Unit for none.
  • Notifications: publish to every handler, sequentially or in parallel with [ParallelNotification], and handlers for a base interface receive derived notifications too.
  • Streaming: IAsyncEnumerable<T> results through CreateStream.
  • Pipeline behaviors: logging, validation, transactions and other cross-cutting code, inlined into each dispatch at compile time instead of iterated from a list.
  • Dependency injection: a generated AddMediator() and IMediator, with handler lifetimes you choose.
  • Analyzer diagnostics: ZAM001–ZAM011, with fixes, in the diagnostics reference.

Optional packages plug into the pipeline; reference one and call its With...() method on AddMediator():

Performance

.NET 10, i9-12900HK, BenchmarkDotNet, ZeroAlloc.Mediator and MediatR in the same run:

Operation Speed vs MediatR ZeroAlloc.Mediator MediatR
Send, static Mediator ~160x faster 0 B 224 B
Publish, 1 handler, static Mediator ~40x faster 0 B 792 B
Send via IMediator, new DI scope per call ~1.2x faster 176 B 496 B

The 176 B is the DI scope and the transient IMediator, not the dispatch. The static rows hold with no factory registered, for a handler without instance state. The performance page has every row, including pipelines and streaming, and explains where each byte comes from.

Learn more

  • Documentation: mediator.zeroalloc.net, or the docs folder on GitHub, including migration guides.
  • Related ZeroAlloc packages:
    • ZeroAlloc.Pipeline (docs): Mediator's pipeline behaviors are ZeroAlloc.Pipeline behaviors, and its generator inlines them.
    • ZeroAlloc.Validation (docs): source-generated validators that ZeroAlloc.Mediator.Validation runs before each handler.
    • ZeroAlloc.Authorization (docs): the policies that ZeroAlloc.Mediator.Authorization checks before dispatch.
    • ZeroAlloc.Results (docs): give a request a Result response and the validation and authorization packages return failures in it instead of throwing.
  • Contributing: issues and pull requests are welcome on GitHub.
  • License: MIT, see LICENSE.

Changes from Previous Version

No structural changes between v6.6.1 and v6.6.2.

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.