Skip to content

Middleware

Pipeline

csharp
builder.Services.AddMessaging(options => { ... })
    .UseMiddleware<LoggingMiddleware>()
    .UseMiddleware<TenantContextMiddleware>()
    .UseMiddleware<ValidationMiddleware>();

// Or use the built-in logging middleware
builder.Services.AddMessaging(options => { ... })
    .UseLogging();

public class LoggingMiddleware : IMessageMiddleware
{
    private readonly ILogger<LoggingMiddleware> _logger;

    public LoggingMiddleware(ILogger<LoggingMiddleware> logger) => _logger = logger;

    public async ValueTask InvokeAsync(
        MessageContext context, 
        MessageDelegate next, 
        CancellationToken ct)
    {
        var sw = Stopwatch.StartNew();
        
        try
        {
            await next(context, ct);
            _logger.LogInformation(
                "Processed {MessageId} in {Elapsed}ms", 
                context.MessageId, 
                sw.ElapsedMilliseconds);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, 
                "Failed to process {MessageId} after {Elapsed}ms", 
                context.MessageId, 
                sw.ElapsedMilliseconds);
            throw;
        }
    }
}