Implementacao do Mediator Pattern para WaiterMediator.
$ dotnet add package WaiterMediatorImplementação leve do padrão Mediator para .NET, focada em cenários CQRS e Domain Events. Fornece abstrações e uma implementação simples para envio de requisições, publicação de notificações e processamento assíncrono de domain events.
WaiterMediator (TargetFramework: net10.0)WaiterMediator (versão contida em WaiterMediator.csproj)IRequest<TResponse> – marca uma requisição que produz TResponse.IRequestHandler<TRequest, TResponse> – processa uma requisição e retorna TResponse.INotification – marca uma notificação/evento sem retorno.INotificationHandler<TNotification> – processa notificações.IPipelineBehavior<TRequest, TResponse> – compõe lógica antes/depois do handler.IWaiter – mediador para Send (requisições) e Publish (notificações).IDomainEventQueue – fila para enfileirar INotification para processamento assíncrono (implementação disponível em WaiterMediator.Extensions.Queues).Microsoft.Extensions.DependencyInjection.Via NuGet:
dotnet add package WaiterMediator --version 1.0.1
Ou referenciando os projetos na solução para desenvolvimento local.
Exemplo de registro do mediador e descoberta automática de handlers/behaviors:
builder.Services.AddWaiter(); // varre assemblies carregados
// ou informar assemblies explicitamente:
builder.Services.AddWaiter(typeof(Program).Assembly);
O método AddWaiter registra:
IWaiter (implementação Waiter)IRequestHandler<,>, INotificationHandler<> e IPipelineBehavior<,> encontradas nos assemblies escaneados.Definir uma requisição e handler:
public record GetUserQuery(int Id) : IRequest<UserDto>;
public class GetUserHandler : IRequestHandler<GetUserQuery, UserDto>
{
public Task<UserDto> Handle(GetUserQuery request, CancellationToken cancellationToken)
{
// Implementação...
throw new NotImplementedException();
}
}
Enviar uma requisição:
var result = await waiter.Send(new GetUserQuery(1), cancellationToken);
Definir e publicar uma notification:
public record UserCreatedEvent(int UserId) : INotification;
public class UserCreatedHandler : INotificationHandler<UserCreatedEvent>
{
public Task Handle(UserCreatedEvent notification, CancellationToken cancellationToken)
{
// Implementação...
return Task.CompletedTask;
}
}
await waiter.Publish(new UserCreatedEvent(1), cancellationToken);
Adicionar comportamento de pipeline:
public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, Func<Task<TResponse>> next)
{
// Antes do handler
var response = await next();
// Depois do handler
return response;
}
}
IRequestHandler<TRequest, TResponse> registrado para cada TRequest.