Resulver.MediatR 9.0.0

dotnet add package Resulver.MediatR --version 9.0.0                
NuGet\Install-Package Resulver.MediatR -Version 9.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Resulver.MediatR" Version="9.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Resulver.MediatR --version 9.0.0                
#r "nuget: Resulver.MediatR, 9.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Resulver.MediatR as a Cake Addin
#addin nuget:?package=Resulver.MediatR&version=9.0.0

// Install Resulver.MediatR as a Cake Tool
#tool nuget:?package=Resulver.MediatR&version=9.0.0                

NuGet Package

Resulver.MediatR NuGet Package

Table of Contents

Overview

Resulver.MediatR is a lightweight extension for MediatR designed to seamlessly integrate MediatR with the Resulver package. It provides structured request handling with Result objects, ensuring a clean and predictable flow without relying on exceptions.

Before using Resulver.MediatR, it is recommended to read the Resulver documentation to understand how Result works and how to use it effectively.

Installation

To install Resulver.MediatR, use the following command:

dotnet add package Resulver.MediatR

Make sure that both MediatR and Resulver are installed in your project.

Usage

Implementing Request Handlers

Resulver.MediatR provides two interfaces for handling requests:

  • IResultBaseRequestHandler<TRequest, TResultContent>: For requests that return a specific value within a Result<TResultContent>.
  • IResultBaseRequestHandler<TRequest>: For requests that only return a Result without content.
Example 1: Handler with a Specific Return Value
public class SumHandler : IResultBaseRequestHandler<SumRequest, int>
{
    public Task<Result<int>> Handle(SumRequest request, CancellationToken cancellationToken)
    {
        var sum = request.A + request.B;
        return Task.FromResult(new Result<int>(sum));
    }
}
Example 2: Handler Without a Specific Return Value
public class RemoveUserHandler : IResultBaseRequestHandler<RemoveUserRequest>
{
    public Task<Result> Handle(RemoveUserRequest request, CancellationToken cancellationToken)
    {
        if (request.UserId <= 0)
        {
            return Task.FromResult(new Result(new UserNotFoundError()));
        }

        return Task.FromResult(new Result());
    }
}

Example Usage

public class SumRequest : IResultBaseRequest<int>
{
    public int A { get; }
    public int B { get; }

    public SumRequest(int a, int b)
    {
        A = a;
        B = b;
    }
}

public class MyController
{
    private readonly IMediator _mediator;

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

    public async Task<IActionResult> CalculateSum(int a, int b)
    {
        var request = new SumRequest(a, b);
        var result = await _mediator.Send(request);

        if (result.IsFailure)
        {
            return BadRequest(result.Errors);
        }

        return Ok(result.Content);
    }
}

Result and Error Handling

With Resulver.MediatR, you can handle errors using ResultError objects:

public class UserNotFoundError : ResultError
{
    public UserNotFoundError() : base("User not found") { }
}

public class InvalidUserIdError : ResultError
{
    public InvalidUserIdError() : base("Invalid User ID") { }
}

Handling Multiple Errors

public Task<Result> Handle(RemoveUserRequest request, CancellationToken cancellationToken)
{
    var errors = new List<ResultError>();

    if (request.UserId <= 0)
    {
        errors.Add(new InvalidUserIdError());
    }

    if (!errors.Any())
    {
        //....
        
        return Task.FromResult(new Result("User removed"));
    }

    return Task.FromResult(new Result(errors));
}

Real-World Example

public class AuthenticateRequest : IResultBaseRequest<User>
{
    public string Username { get; }
    public string Password { get; }

    public AuthenticateRequest(string username, string password)
    {
        Username = username;
        Password = password;
    }
}

public class AuthenticateHandler : IResultBaseRequestHandler<AuthenticateRequest, User>
{
    private readonly IUserRepository _userRepository;

    public AuthenticateHandler(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public Task<Result<User>> Handle(AuthenticateRequest request, CancellationToken cancellationToken)
    {
        var user = _userRepository.Find(request.Username, request.Password);

        if (user == null)
        {
            return Task.FromResult(new UserNotFoundError());
        }

        return Task.FromResult(new Result<User>(user,"Authentication successful"));
    }
}

Best Practices

  • Always check IsSuccess or IsFailure before accessing the result content or errors.
  • Use meaningful messages and errors to provide clear debugging information.
  • Avoid mixing exceptions with Result, keeping control flow predictable.
  • Handle multiple errors when necessary, leveraging the flexibility of Result.
  • Keep handlers simple, ensuring they focus on a single responsibility.

By following these guidelines, you can effectively use Resulver.MediatR to write cleaner, more maintainable code.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
9.0.0 214 3/7/2025