Gufel.Dispatcher 1.1.0

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

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:

  1. ParallelMessagePublishStrategy (Default)

    • Processes subscribers in parallel
    • Best for independent subscribers
    • Faster execution
  2. 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 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. 
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
1.1.0 240 6/10/2025
1.0.5 65 5/10/2025
1.0.4 66 5/10/2025
1.0.3 78 5/10/2025