Gufel.Dispatcher
1.1.0
dotnet add package Gufel.Dispatcher --version 1.1.0
NuGet\Install-Package Gufel.Dispatcher -Version 1.1.0
<PackageReference Include="Gufel.Dispatcher" Version="1.1.0" />
<PackageVersion Include="Gufel.Dispatcher" Version="1.1.0" />
<PackageReference Include="Gufel.Dispatcher" />
paket add Gufel.Dispatcher --version 1.1.0
#r "nuget: Gufel.Dispatcher, 1.1.0"
#addin nuget:?package=Gufel.Dispatcher&version=1.1.0
#tool nuget:?package=Gufel.Dispatcher&version=1.1.0
Gufel CQRS
A lightweight CQRS (Command Query Responsibility Segregation) and in-memory pub/sub implementation for .NET applications.
Features
- Command/Query handling with pipeline support
- In-memory message publishing and subscription
- Support for both synchronous and parallel message publishing strategies
- Dependency injection integration
- Easy to use and extend
Installation
dotnet add package Gufel.Dispatcher
Usage
1. Dispatcher (CQRS)
The Dispatcher handles commands and queries with support for pipeline handlers.
Basic Setup
// Register services
var services = new ServiceCollection();
services.AddDispatcher(typeof(Program).Assembly);
var serviceProvider = services.BuildServiceProvider();
// Get dispatcher instance
var dispatcher = serviceProvider.GetRequiredService<IDispatcher>();
Sample Command/Query Implementation
// Define your request and response
public class CreateOrderRequest : IRequest<CreateOrderResponse>
{
public int ProductId { get; set; }
public int Quantity { get; set; }
}
public class CreateOrderResponse : IResponse
{
public int OrderId { get; set; }
public bool Success { get; set; }
}
// Implement request handler
public class CreateOrderHandler : IRequestHandler<CreateOrderRequest, CreateOrderResponse>
{
public async Task<CreateOrderResponse> Handle(CreateOrderRequest request, CancellationToken cancellation)
{
// Handle the request
return new CreateOrderResponse
{
OrderId = 1,
Success = true
};
}
}
// Optional: Implement pipeline handler
public class LoggingPipeline : IPipelineHandler<CreateOrderRequest, CreateOrderResponse>
{
public async Task Handle(CreateOrderRequest request, CancellationToken cancellation)
{
Console.WriteLine($"Processing order for product {request.ProductId}");
await Task.CompletedTask;
}
}
// Usage
var request = new CreateOrderRequest { ProductId = 1, Quantity = 2 };
var response = await dispatcher.Dispatch(request, CancellationToken.None);
2. Message Publisher (Pub/Sub)
The Message Publisher provides in-memory publish/subscribe functionality.
Basic Setup
// Register services
var services = new ServiceCollection();
services.AddMessagePublisher(); // Uses ParallelMessagePublishStrategy by default
// OR
services.AddMessagePublisher(new WhenAllMessagePublishStrategy());
var serviceProvider = services.BuildServiceProvider();
// Get publisher instance
var publisher = serviceProvider.GetRequiredService<IMessagePublisher>();
Sample Publisher/Subscriber Implementation
// Define your message model
public class OrderCreatedMessage
{
public int OrderId { get; set; }
public DateTime CreatedAt { get; set; }
}
// Implement subscriber
public class OrderNotificationHandler : ISubscribeHandler<OrderCreatedMessage>
{
public string Topic => "order-created";
public async Task HandleAsync(OrderCreatedMessage data)
{
Console.WriteLine($"Order {data.OrderId} was created at {data.CreatedAt}");
await Task.CompletedTask;
}
}
// Register subscriber
services.AddSingleton<ISubscribeHandler<OrderCreatedMessage>, OrderNotificationHandler>();
// Publish message
var message = new OrderCreatedMessage
{
OrderId = 1,
CreatedAt = DateTime.UtcNow
};
publisher.Publish("order-created", message);
Publishing Strategies
The Message Publisher supports two publishing strategies:
ParallelMessagePublishStrategy (Default)
- Processes subscribers in parallel
- Best for independent subscribers
- Faster execution
WhenAllMessagePublishStrategy
- Processes subscribers sequentially
- Waits for all subscribers to complete
- Better for dependent subscribers
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. 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. |
-
net9.0
- Microsoft.Extensions.DependencyInjection (>= 9.0.4)
- Microsoft.Extensions.Logging.Abstractions (>= 9.0.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.