🚀How to Use MediatR Pipeline Behavior in .NET 8

🚀How to Use MediatR Pipeline Behavior in .NET 8

In modern software development, ensuring that our applications are maintainable, testable, and scalable is crucial. One tool that has gained popularity for achieving these goals in .NET applications is MediatR. MediatR facilitates the implementation of the mediator pattern, which helps in reducing the direct dependencies between components. One of its powerful features is Pipeline Behavior, which allows you to add pre- and post-processing steps to your request handling. In this blog post, we’ll explore what MediatR Pipeline Behavior is, why it’s beneficial, how to implement it, its pros and cons, and conclude with some final thoughts.

What is MediatR Pipeline Behavior?

MediatR Pipeline Behavior is a feature that allows you to inject additional logic around the handling of requests. Think of it as an assembly line in a factory where each stage can add or modify the product being built. In the context of MediatR, this means you can add cross-cutting concerns like logging, validation, or performance monitoring before and after your request handler processes a request.

Why We Need This

In any robust application, there are several concerns that need to be addressed globally, such as logging, validation, exception handling, and more. Without a centralized way to handle these, you’d have to scatter this logic across various parts of your codebase, leading to duplication and maintenance challenges. MediatR Pipeline Behavior centralizes these concerns, ensuring they are handled consistently and making your code cleaner and easier to maintain.

How to Implement MediatR Pipeline Behavior in .NET 8

Implementing MediatR Pipeline Behavior in .NET 8 is straightforward. Here’s a step-by-step guide to get you started:

🧑‍💻Install MediatR and

First, you need to install the necessary NuGet packages. You can do this via the Package Manager Console or using the .NET CLI:

dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
Enter fullscreen mode
Exit fullscreen mode

🧑‍💻Create a Pipeline Behavior:
Create a class that implements IPipelineBehavior<TRequest,
. This interface has a single method Handle, which
you can use to define your pre- and post-processing logic.

using MediatR;
using System.Threading;
using System.Threading.Tasks; public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{ public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken) { // Pre-processing logic Console.WriteLine($"Handling {typeof(TRequest).Name}"); var response = await next(); // Post-processing logic Console.WriteLine($"Handled {typeof(TResponse).Name}"); return response; }
Enter fullscreen mode
Exit fullscreen mode

🧑‍💻Register the Pipeline Behavior:
In your Startup.cs or Program.cs (depending on the template you are using), register your pipeline behavior with the DI container.

using MediatR;
using Microsoft.Extensions.DependencyInjection; var services = new ServiceCollection(); services.AddMediatR(typeof(Program));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
Enter fullscreen mode
Exit fullscreen mode

🧑‍💻Create and Handle a Request:
Define a request and its handler to see the pipeline behavior in action.

using MediatR;
using System.Threading;
using System.Threading.Tasks; public class MyRequest : IRequest<MyResponse>
{ public string Message { get; set; }
} public class MyResponse
{ public string ResponseMessage { get; set; }
} public class MyRequestHandler : IRequestHandler<MyRequest, MyResponse>
{ public Task<MyResponse> Handle(MyRequest request, CancellationToken cancellationToken) { return Task.FromResult(new MyResponse { ResponseMessage = $"Hello, {request.Message}" }); }
Enter fullscreen mode
Exit fullscreen mode

Pros and Cons of Using MediatR Pipeline Behavior


  1. Centralized Cross-Cutting Concerns: It allows you to centralize logging, validation, and other concerns, making your code cleaner.
  2. Consistent Application: Ensures that these concerns are applied consistently across all request handlers.
  3. Maintainability: Reduces code duplication and makes your application easier to maintain.
  4. Testability: Facilitates unit testing by isolating cross-cutting concerns.


  1. Learning Curve: There is a bit of a learning curve to understand and implement MediatR and its pipeline behaviors.
  2. Overhead: Adding multiple pipeline behaviors can introduce some performance overhead, although this is usually negligible.


MediatR Pipeline Behavior in .NET 8 offers a powerful way to handle cross-cutting concerns in a centralized and consistent manner. By following the steps outlined in this blog post, you can implement this feature in your applications, leading to cleaner, more maintainable, and more testable code. While there are some trade-offs to consider, the benefits often outweigh the drawbacks, making MediatR Pipeline Behavior a valuable tool in your .NET development toolkit.

Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment


No comments yet. Why don’t you start the discussion?

    Leave a Reply

    Your email address will not be published. Required fields are marked *