MediatR Dependency Injection .Net 6

Bob Code
2 min readOct 20, 2023

--

Without using DI (Dependency Injection) you will most likely get this error

System.InvalidOperationException: Unable to resolve service for type ‘MediatR.IMediator’ while attempting to activate ‘nameofproject’

To use MediatR with dependency injection in a .NET application, you’ll need to follow these steps:

  1. Install the MediatR NuGet package in your project:
dotnet add package Mediat

2. If you’re using MediatR with ASP.NET Core, you can also install the MediatR.Extensions.Microsoft.DependencyInjection package to simplify the integration:

dotnet add package MediatR.Extensions.Microsoft.DependencyInjection

3. Define your request and request handler classes. These are the core components of MediatR. A request represents a command or query, and a request handler processes the request. For example:

// Request class
public class MyRequest : IRequest<string>
{
public string Data { get; set; }
}

// Request handler class
public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
public async Task<string> Handle(MyRequest request, CancellationToken cancellationToken)
{
// Process the request and return a result
return "Processed: " + request.Data;
}
}

4. In your application’s Program.cs or startup class, configure MediatR and set up dependency injection:

If you’re using MediatR with ASP.NET Core, you can set it up in the ConfigureServices method in your Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
// Add MediatR with the assembly containing your request handlers
services.AddMediatR(Assembly.GetExecutingAssembly());

// Other service registrations
// ...
}

If you’re not using ASP.NET Core, you can set up MediatR in the Program.cs:

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;

// Add MediatR with the assembly containing your request handlers
services.AddMediatR(Assembly.GetExecutingAssembly());

// Other service registrations
// ...

var app = builder.Build();
// ...
app.Run();

If you are using MediatR 12.0.0 or higher version then you will have to do the following instead

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));

If your handler is in another project, use the following snippet where MoneyTransferHandler has to be the assembley, here the class name of the handler

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(MoneyTransferHandler).Assembly));

Now you can inject and use IMediator in your controllers or services to send requests:

public class MyController : ControllerBase
{
private readonly IMediator _mediator;

public MyController(IMediator mediator)
{
_mediator = mediator;
}

[HttpGet]
public async Task<IActionResult> MyAction()
{
var result = await _mediator.Send(new MyRequest { Data = "Some data" });
return Ok(result);
}
}

With these steps, MediatR is set up with dependency injection in your .NET application. When you send a request using IMediator.Send, MediatR will locate the appropriate request handler and execute it, returning the response. This pattern helps you keep your code clean and organized by separating concerns and promoting the single responsibility principle.

Error:

System.InvalidOperationException: No service for type ‘MediatR.IRequestHandler`[nameofyourclass]’ has been registered.

Solution

This could mean that your DI container still cannot find the handler. For instance because it is in another project.

The trick here is simply to add ‘Containing’ to RegisterServicesFromAssembly

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining(typeof(MoneyTransferHandler)));

--

--

Bob Code

All things related to Memes, .Net/C#, Azure, DevOps and Microservices