Easy.Mediator
2.0.0
dotnet add package Easy.Mediator --version 2.0.0
NuGet\Install-Package Easy.Mediator -Version 2.0.0
<PackageReference Include="Easy.Mediator" Version="2.0.0" />
<PackageVersion Include="Easy.Mediator" Version="2.0.0" />
<PackageReference Include="Easy.Mediator" />
paket add Easy.Mediator --version 2.0.0
#r "nuget: Easy.Mediator, 2.0.0"
#:package Easy.Mediator@2.0.0
#addin nuget:?package=Easy.Mediator&version=2.0.0
#tool nuget:?package=Easy.Mediator&version=2.0.0
๐ Easy.Mediator
Easy.Mediator is a lightweight, extensible, and intuitive library for implementing the Mediator pattern in .NET applications. It helps you separate concerns, reduce coupling, and keep your code clean and testable.
โจ Features
- โ Supports Requests/Responses and Notifications
- โ๏ธ Automatic handler registration via Dependency Injection
- ๐ Compatible with .NET Standard 2.1, .NET CORE and .NET 5+ or higher
- ๐ Seamless integration with
Microsoft.Extensions.DependencyInjection
- ๐ฆ use-friendly
- ๐งฉ NEW: Support for Pipeline Behaviors (interceptors like logging, validation, etc.)
๐ฆ Installation
Install via the .NET CLI:
dotnet add package Easy.Mediator
๐ Basic Usage
๐ Handling Notifications
1. Define a notification
public record NewUserNotification(string UserName, string Message) : INotification;
2. Implement a notification handler
public class EmailNotificationHandler : INotificationHandler<NewUserNotification>
{
public Task Handle(NewUserNotification notification, CancellationToken cancellationToken = default)
{
Console.WriteLine($"[Email] To: {notification.UserName} - {notification.Message}");
return Task.CompletedTask;
}
}
3. Publish the notification
var services = new ServiceCollection();
services.AddEasyMediator();
var provider = services.BuildServiceProvider();
var mediator = provider.GetRequiredService<IMediator>();
await mediator.Publish(new NewUserNotification("Bob", "Bem-vindo!"));
//[Email] To: Bob - Welcome to the system!
๐ฌ Handling Requests (Request/Response)
1. Define a request and its response
public record PingCommand(string Message) : IRequest<PongResponse>;
public record PongResponse(string Message);
2. Implement a request handler
public class PingCommandHandler : IRequestHandler<PingCommand, PongResponse>
{
public Task<PongResponse> Handle(PingCommand request, CancellationToken cancellationToken = default)
{
return Task.FromResult(new PongResponse($"{request.Message} => Pong!"));
}
}
3. Send the request and receive the response
var response = await mediator.Send(new PingCommand("Ping!"));
Console.WriteLine(response.Message); // Ping! => Pong!
๐๏ธ Pipeline Behaviors (Interceptors)
Easy.Mediator supports pipeline behaviors that allow you to intercept request execution before and/or after the handler. Useful for:
- Logging
- Validation
- Caching
- Handling exceptions
- Auditing
โ Implementing a Behavior
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
public async Task<TResponse> HandleAsync(
TRequest request,
CancellationToken cancellationToken,
Func<TRequest, CancellationToken, Task<TResponse>> next)
{
Console.WriteLine($">>> Handling {typeof(TRequest).Name}");
var response = await next(request, cancellationToken);
Console.WriteLine($"<<< Handled {typeof(TRequest).Name}");
return response;
}
}
๐ง Registering Behaviors
Behaviors must be registered in the desired order:
services.AddEasyMediator(cfg =>
{
cfg.AddRequestHandlersFromAssembly(typeof(SomeHandler).Assembly);
cfg.AddPipelineBehavior(typeof(LoggingBehavior<,>));
cfg.AddPipelineBehavior(typeof(ValidationBehavior<,>));
});
โน๏ธ The registration order defines the execution flow โ behaviors registered first run before later ones and the final handler.
๐งช Example of a ValidationBehavior
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> _validators;
public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators) =>
_validators = validators;
public async Task<TResponse> HandleAsync(
TRequest request,
CancellationToken ct,
Func<TRequest, CancellationToken, Task<TResponse>> next)
{
var failures = _validators
.Select(v => v.Validate(request))
.SelectMany(r => r.Errors)
.Where(f => f != null);
if (failures.Any())
throw new ValidationException(failures);
return await next(request, ct);
}
}
๐ License
This project is licensed under the MIT License.
You are free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the software, provided that you include the original copyright and license notice.
See the License.txt file for full details.
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 | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | 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.1
- Easy.Mediator.Abstractions (>= 1.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
- 🧩 NEW: Support for **Pipeline Behaviors** (interceptors like logging, validation, etc.)