ZeroAlloc.Mediator
1.1.6
dotnet add package ZeroAlloc.Mediator --version 1.1.6
NuGet\Install-Package ZeroAlloc.Mediator -Version 1.1.6
<PackageReference Include="ZeroAlloc.Mediator" Version="1.1.6" />
<PackageVersion Include="ZeroAlloc.Mediator" Version="1.1.6" />
<PackageReference Include="ZeroAlloc.Mediator" />
paket add ZeroAlloc.Mediator --version 1.1.6
#r "nuget: ZeroAlloc.Mediator, 1.1.6"
#:package ZeroAlloc.Mediator@1.1.6
#addin nuget:?package=ZeroAlloc.Mediator&version=1.1.6
#tool nuget:?package=ZeroAlloc.Mediator&version=1.1.6
ZeroAlloc.Mediator
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 MediatorService automatically)
services.AddSingleton<IMediator, MediatorService>();
// 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 |
See docs/performance.md for the full benchmark table and zero-allocation design explanation.
Features
- Request/Response — strongly-typed
Sendoverloads per request type - Notifications — sequential or parallel (
[ParallelNotification]) dispatch - Streaming —
IAsyncEnumerable<T>viaCreateStream - Pipeline Behaviors — compile-time inlined middleware chain (logging, validation, etc.)
- 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 |
| 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 | Versions 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. |
-
net10.0
- ZeroAlloc.Pipeline (>= 0.1.1)
-
net8.0
- ZeroAlloc.Pipeline (>= 0.1.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.