SharpDispatch 1.0.1
dotnet add package SharpDispatch --version 1.0.1
NuGet\Install-Package SharpDispatch -Version 1.0.1
<PackageReference Include="SharpDispatch" Version="1.0.1" />
<PackageVersion Include="SharpDispatch" Version="1.0.1" />
<PackageReference Include="SharpDispatch" />
paket add SharpDispatch --version 1.0.1
#r "nuget: SharpDispatch, 1.0.1"
#:package SharpDispatch@1.0.1
#addin nuget:?package=SharpDispatch&version=1.0.1
#tool nuget:?package=SharpDispatch&version=1.0.1
<div align="center"> <img src="SharpDispatch.jpg" alt="SharpDispatch Logo" width="150" /> </div>
SharpDispatch
Blazingly fast CQRS command dispatching for .NET 10
Zero allocations in hot paths โข Native AOT ready โข Zero external dependencies
SharpDispatch is a lightweight, high-performance CQRS command dispatching library for .NET 10.
๐ Key Features
- โก Sub-microsecond dispatch โ ~10โ15ns latency, zero allocations for hot paths
- ๐ฏ Native AOT ready โ Full ahead-of-time compilation support
- ๐ฆ Zero dependencies โ Only
Microsoft.Extensions.DependencyInjection.Abstractions - ๐ Type-safe โ Compile-time handler registration and exhaustive dispatch
- ๐งช Test-friendly โ In-memory dispatcher for fast unit tests
- โป๏ธ Zero-copy ready โ Pass
ReadOnlySpan<T>andMemory<T>through commands
โจ What's Included
| Type | Purpose |
|---|---|
ICommand |
Marker interface for commands |
ICommandHandler<T> |
Handler contract |
ICommandDispatcher |
Dispatcher abstraction |
CommandDispatchResult |
Stack-allocated result (record struct) |
ServiceProviderCommandDispatcher |
DI-based dispatcher (default) |
InMemoryCommandDispatcher |
In-memory dispatcher for tests |
OptimizedCommandDispatcher |
High-performance FrozenDictionary-based dispatcher |
CommandDispatcherBuilder |
AOT-safe fluent builder |
๐ฏ Quick Start
1. Define a Command & Handler
using SharpDispatch;
// Command
public class CreateOrderCommand : ICommand
{
public required string OrderId { get; init; }
public required decimal Amount { get; init; }
}
// Handler
public class CreateOrderCommandHandler : ICommandHandler<CreateOrderCommand>
{
public async Task<CommandDispatchResult> HandleAsync(
CreateOrderCommand command,
CancellationToken cancellationToken)
{
// Handle command...
return CommandDispatchResult.Ok($"Order {command.OrderId} created");
}
}
2. Register & Dispatch
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddCommandHandler<CreateOrderCommand, CreateOrderCommandHandler>();
services.AddCommandDispatcher(); // or AddOptimizedCommandDispatcher()
var provider = services.BuildServiceProvider();
var dispatcher = provider.GetRequiredService<ICommandDispatcher>();
var result = await dispatcher.DispatchAsync(
new CreateOrderCommand { OrderId = "ORD-001", Amount = 99.99m }
);
๐ฅ Three Dispatcher Options
1. ServiceProviderCommandDispatcher (Default)
Resolves handlers from DI on each call.
- Best for: Most applications, mixed handler lifetimes
- Overhead: ~50โ200ns per dispatch
services.AddCommandDispatcher();
2. OptimizedCommandDispatcher (Recommended for High Throughput)
Pre-built typed delegates + FrozenDictionary = zero-allocation dispatch.
- Best for: APIs, high-throughput workloads
- Hot path: ~10โ15ns for singleton handlers
services.AddOptimizedCommandDispatcher(cfg =>
{
cfg.AddHandler<CreateOrderCommand, CreateOrderCommandHandler>();
});
3. InMemoryCommandDispatcher (For Testing)
In-memory handler registry without DI.
var dispatcher = new InMemoryCommandDispatcher();
dispatcher.RegisterHandler(new CreateOrderCommandHandler());
๐ Native AOT Ready
Zero reflection โข Fully verifiable โข Ready for PublishAot.
services.AddOptimizedCommandDispatcher(cfg =>
{
cfg.AddHandler<CreateOrderCommand, CreateOrderCommandHandler>();
});
No MakeGenericType, no Activator.CreateInstance โ just explicit generic instantiation the AOT compiler can see.
๐งช Perfect for Testing
[Fact]
public async Task ShouldCreateOrder()
{
var dispatcher = new InMemoryCommandDispatcher();
dispatcher.RegisterHandler(new CreateOrderCommandHandler());
var result = await dispatcher.DispatchAsync(
new CreateOrderCommand { OrderId = "ORD-001", Amount = 99.99m }
);
Assert.True(result.Success);
}
๐ Learn More
For comprehensive documentation, benchmarks, and advanced patterns, visit the GitHub repository.
<div align="center">
Questions? Open an issue or discussion on GitHub.
Made with โค๏ธ for .NET developers who care about performance.
</div>
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Second release of SharpDispatch with SourceLink integration - high-performance CQRS command dispatching for .NET 10.