ZeroAlloc.Mediator.Authorization.Generator
4.1.3
dotnet add package ZeroAlloc.Mediator.Authorization.Generator --version 4.1.3
NuGet\Install-Package ZeroAlloc.Mediator.Authorization.Generator -Version 4.1.3
<PackageReference Include="ZeroAlloc.Mediator.Authorization.Generator" Version="4.1.3"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="ZeroAlloc.Mediator.Authorization.Generator" Version="4.1.3" />
<PackageReference Include="ZeroAlloc.Mediator.Authorization.Generator"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add ZeroAlloc.Mediator.Authorization.Generator --version 4.1.3
#r "nuget: ZeroAlloc.Mediator.Authorization.Generator, 4.1.3"
#:package ZeroAlloc.Mediator.Authorization.Generator@4.1.3
#addin nuget:?package=ZeroAlloc.Mediator.Authorization.Generator&version=4.1.3
#tool nuget:?package=ZeroAlloc.Mediator.Authorization.Generator&version=4.1.3
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 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 |
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.)
- Bridge Packages —
WithCache(),WithValidation(),WithResilience(),WithTelemetry()(OpenTelemetry spans + metrics onIRequest<T>.Send),WithAuthorization()([Authorize]-gated dispatch viaZeroAlloc.Authorizationpolicies) - 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
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.1.3 | 211 | 5/13/2026 |