DotnetDispatcher 1.0.1
See the version list below for details.
dotnet add package DotnetDispatcher --version 1.0.1
NuGet\Install-Package DotnetDispatcher -Version 1.0.1
<PackageReference Include="DotnetDispatcher" Version="1.0.1" />
<PackageVersion Include="DotnetDispatcher" Version="1.0.1" />
<PackageReference Include="DotnetDispatcher" />
paket add DotnetDispatcher --version 1.0.1
#r "nuget: DotnetDispatcher, 1.0.1"
#:package DotnetDispatcher@1.0.1
#addin nuget:?package=DotnetDispatcher&version=1.0.1
#tool nuget:?package=DotnetDispatcher&version=1.0.1
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.
- The generated dispatcher is automatically registered in DI, allowing easy injection and usage.
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.