ZeroAlloc.Mediator.Validation 6.6.2

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

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.
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

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
6.6.2 209 10/16/2026
6.6.1 377 10/15/2026
6.6.0 430 10/12/2026
6.5.0 307 10/11/2026
6.4.3 124 10/11/2026
6.4.2 523 10/11/2026
6.4.1 106 10/11/2026
6.4.0 120 10/10/2026
6.3.0 136 10/10/2026
6.2.0 107 10/9/2026
6.1.1 470 10/2/2026
6.1.0 177 9/30/2026
6.0.3 120 9/30/2026
6.0.2 178 9/28/2026
6.0.1 102 9/28/2026
6.0.0 980 9/27/2026
5.1.5 902 9/21/2026
5.1.4 254 9/20/2026
5.1.3 101 9/20/2026
5.1.2 110 9/20/2026
Loading failed