ZeroAlloc.Mediator 4.1.4

dotnet add package ZeroAlloc.Mediator --version 4.1.4
                    
NuGet\Install-Package ZeroAlloc.Mediator -Version 4.1.4
                    
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.Mediator" Version="4.1.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="ZeroAlloc.Mediator" Version="4.1.4" />
                    
Directory.Packages.props
<PackageReference Include="ZeroAlloc.Mediator" />
                    
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.Mediator --version 4.1.4
                    
#r "nuget: ZeroAlloc.Mediator, 4.1.4"
                    
#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.Mediator@4.1.4
                    
#: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.Mediator&version=4.1.4
                    
Install as a Cake Addin
#tool nuget:?package=ZeroAlloc.Mediator&version=4.1.4
                    
Install as a Cake Tool

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
public class OrderController(IMediator mediator)
{
    public async Task<IResult> PlaceOrder(CreateOrder cmd, CancellationToken ct)
    {
        var id = await mediator.Send(cmd, ct);   // returns OrderId, no boxing
        return Results.Created($"/orders/{id}", id);
    }
}

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
  • StreamingIAsyncEnumerable<T> via CreateStream
  • Pipeline Behaviors — compile-time inlined middleware chain (logging, validation, etc.)
  • Bridge PackagesWithCache(), 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 AllocationValueTask, 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

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 was computed.  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 (13)

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

Package Downloads
ZeroAlloc.Outbox

Source-generated transactional outbox for .NET.

AI.Sentinel

Security monitoring middleware for IChatClient — prompt injection, hallucination, and operational anomaly detection with an intervention engine.

ZeroAlloc.Mediator.Validation

Pipeline behavior that validates IRequest<T> via ZeroAlloc.Validation before dispatch. Validation failures surface as Result<T, ValidationError> — no exceptions on the hot path.

ZeroAlloc.Scheduling.Mediator

ZeroAlloc.Mediator bridge for ZeroAlloc.Scheduling — dispatches jobs via IMediator.Send.

ZeroAlloc.Mediator.Authorization

Pipeline behavior that authorizes IRequest<T> (or IAuthorizedRequest<T>) via ZeroAlloc.Authorization before dispatch. Source-generated per-request policy lookup; deny throws AuthorizationDeniedException or returns Result<T, AuthorizationFailure> depending on the request marker.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.1.4 1,559 5/18/2026
4.1.3 1,445 5/12/2026
4.1.2 261 5/12/2026
4.1.1 498 5/7/2026
4.1.0 199 5/6/2026
4.0.0 176 5/3/2026
2.1.1 102 4/29/2026
2.1.0 167 4/28/2026
2.0.1 165 4/29/2026
2.0.0 138 4/28/2026
1.3.0 96 4/28/2026
1.2.1 92 4/28/2026
1.2.0 100 4/24/2026
1.1.8 4,977 3/22/2026
1.1.7 102 3/20/2026
1.1.6 106 3/19/2026
1.1.5 101 3/17/2026
Loading failed