DotnetDispatcher 1.0.2
dotnet add package DotnetDispatcher --version 1.0.2
NuGet\Install-Package DotnetDispatcher -Version 1.0.2
<PackageReference Include="DotnetDispatcher" Version="1.0.2" />
<PackageVersion Include="DotnetDispatcher" Version="1.0.2" />
<PackageReference Include="DotnetDispatcher" />
paket add DotnetDispatcher --version 1.0.2
#r "nuget: DotnetDispatcher, 1.0.2"
#:package DotnetDispatcher@1.0.2
#addin nuget:?package=DotnetDispatcher&version=1.0.2
#tool nuget:?package=DotnetDispatcher&version=1.0.2
DotNet Dispatcher - AOT-Friendly CQRS Dispatcher
Overview
DotNet Dispatcher is a lightweight, compile-time generated CQRS dispatcher for .NET. By leveraging Roslyn code generation, this framework eliminates runtime reflection, making it highly AOT-friendly and performance-efficient.
With DotNet Dispatcher, developers can define commands and queries with their corresponding handlers, and the dispatcher is automatically generated at compile time.
Features
✅ Zero Runtime Reflection - Uses Roslyn to generate code at compile time.
✅ AOT-Friendly - Ideal for .NET Native AOT scenarios.
✅ Lightweight - No additional runtime dependencies or complexity.
✅ Explicit yet Automated Wiring - Just define your handlers, and the generator does the rest.
✅ Fast & Efficient - No runtime service lookups; everything is wired at compile time.
Installation
# Clone the repository
$ git clone https://github.com/psimsa/dotnet-dispatcher.git
$ cd dotnet-dispatcher
# Add to your .NET project
$ dotnet add package DotNetDispatcher
Getting Started
1. Define a Command & Handler
Create a command by implementing ICommand<TResponse> and a corresponding handler:
public record PlaceOrderCommand(string ProductId, int Quantity) : ICommand<OrderResponse>;
public class PlaceOrderHandler : ICommandHandler<PlaceOrderCommand, OrderResponse>
{
public Task<OrderResponse> Handle(PlaceOrderCommand command)
{
return Task.FromResult(new OrderResponse(Guid.NewGuid(), "Order Placed Successfully"));
}
}
2. Define a Query & Handler
public record GetOrderQuery(Guid OrderId) : IQuery<OrderResponse>;
public class GetOrderHandler : IQueryHandler<GetOrderQuery, OrderResponse>
{
public Task<OrderResponse> Handle(GetOrderQuery query)
{
return Task.FromResult(new OrderResponse(query.OrderId, "Order Retrieved"));
}
}
3. Use the Dispatcher
After compilation, the dispatcher is automatically generated and can be injected like this:
public class OrderService
{
private readonly IDispatcher _dispatcher;
public OrderService(IDispatcher dispatcher)
{
_dispatcher = dispatcher;
}
public async Task<OrderResponse> PlaceOrderAsync(string productId, int quantity)
{
return await _dispatcher.Send(new PlaceOrderCommand(productId, quantity));
}
}
How It Works
- Roslyn Source Generator scans for commands and queries marked with
[GenerateDispatcher]. - The dispatcher implementation is generated at compile time, avoiding reflection-based dependency resolution.
- Aside from the generated dispatcher, the generator also creates an extension method for
IServiceCollectioncalledRegisterCommandDispatcherAndHandlersthat ensures necessary dependencies are automatically registered in DI, allowing easy injection and usage. Simply callservices.RegisterCommandDispatcherAndHandlers()during your DI setup.
Benefits Over MediatR
| Feature | MediatR | DotNet Dispatcher |
|---|---|---|
| Reflection-Free | ❌ Uses runtime reflection | ✅ No runtime reflection |
| AOT-Friendly | ❌ May have issues | ✅ Fully compatible |
| Performance | ⚠️ Slight overhead | ✅ Optimized compile-time wiring |
| Setup | ✅ Easy | ✅ Easy (via source generator) |
Configuration & Customization
You can customize the dispatcher behavior by modifying the source generator logic or extending handler interfaces.
Contributing
We welcome contributions! Please feel free to:
- Open issues for bugs or feature requests.
- Submit PRs to enhance functionality or improve documentation.
License
This project is licensed under the MIT License.
Author
Maintained by psimsa.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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 was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.