MediatR 在 .NET Core 中的详细用法和深入讲解

MediatR 是 .NET 中的一种实现 中介者模式(Mediator Pattern) 的库。它允许您将应用程序中的请求和响应解耦,使各个组件通过一个中介者进行通信,避免了直接依赖,从而使得代码更加松耦合,易于扩展和维护。

MediatR 被广泛应用于 ASP.NET Core 应用程序中,尤其是在处理复杂业务逻辑和请求响应时。本篇文章将深入讲解 MediatR 的安装、配置、使用场景、代码示例以及一些高级功能。

1. MediatR 的安装与配置

在使用 MediatR 前,首先需要安装其 NuGet 包。MediatR 的核心库以及用于与 ASP.NET Core 集成的扩展库可以通过 NuGet 安装。

1.1 安装 NuGet 包

通过 NuGet 包管理器安装 MediatR:

Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection

或者通过 .NET CLI 安装:

dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
1.2 配置 MediatR

在 ASP.NET Core 应用程序中配置 MediatR。通常你会在 Program.cs 文件中配置 MediatR 服务。

using MediatR;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

// 注册 MediatR 服务
builder.Services.AddMediatR(Assembly.GetExecutingAssembly());

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

AddMediatR() 会扫描指定的程序集,在本例中是 Assembly.GetExecutingAssembly(),自动注册应用中定义的请求和处理程序。

2. 请求与处理程序的基本用法

MediatR 使用 请求/响应模式,即客户端通过请求发送数据,并由处理程序处理后返回响应。请求通常是实现 IRequest<TResponse> 接口的类,TResponse 是请求的响应类型。处理程序需要实现 IRequestHandler<TRequest, TResponse> 接口来处理请求。

2.1 创建请求类

请求类实现 IRequest<TResponse> 接口,表示希望返回某种类型的响应。

public class MyRequest : IRequest<string>
{
    public string Name { get; set; }
}

MyRequest 是一个请求类,它有一个 Name 属性,并且返回一个 string 类型的响应。

2.2 创建处理程序

处理程序是实现了 IRequestHandler<TRequest, TResponse> 接口的类。处理程序中会定义如何处理请求,并生成响应。

using MediatR;
using System.Threading;
using System.Threading.Tasks;

public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
    public Task<string> Handle(MyRequest request, CancellationToken cancellationToken)
    {
        // 在这里处理请求的业务逻辑
        return Task.FromResult($"Hello, {request.Name}!");
    }
}

MyRequestHandler 处理 MyRequest 请求,并返回一个字符串响应,格式为 "Hello, [Name]!"

2.3 发送请求

请求通过 IMediator 接口发送,IMediator 是 MediatR 中的核心组件。你可以将它注入到控制器或者服务中,然后通过调用 Send 方法发送请求。

using MediatR;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
    private readonly IMediator _mediator;

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

    [HttpGet]
    public async Task<IActionResult> Get([FromQuery] string name)
    {
        var request = new MyRequest { Name = name };
        var response = await _mediator.Send(request);  // 发送请求并获取响应
        return Ok(response);  // 返回响应
    }
}

MyController 控制器中,我们通过构造函数注入了 IMediator,并在 Get 方法中发送了 MyRequest 请求。响应会被返回给客户端。

3. 使用通知(Notification)与通知处理程序

除了请求/响应模式,MediatR 还支持 通知模式,通知类似于事件,它允许多个处理程序同时处理同一条通知。

3.1 创建通知类

通知类实现 INotification 接口,通常不返回响应数据。通知用于传播事件或某种状态变化。

public class MyNotification : INotification
{
    public string Message { get; set; }
}

MyNotification 是一个简单的通知类,包含一个 Message 属性。

3.2 创建通知处理程序

通知处理程序是实现了 INotificationHandler<TNotification> 接口的类。一个通知可以由多个处理程序处理。

public class MyNotificationHandler : INotificationHandler<MyNotification>
{
    public Task Handle(MyNotification notification, CancellationToken cancellationToken)
    {
        // 处理通知的逻辑
        Console.WriteLine($"Notification received: {notification.Message}");
        return Task.CompletedTask;
    }
}

MyNotificationHandler 中,我们处理了 MyNotification 通知,简单地将通知内容输出到控制台。

3.3 发布通知

与请求发送类似,发布通知也通过 IMediator 完成。通知通过 Publish 方法发布。

[HttpPost]
public async Task<IActionResult> Post([FromBody] string message)
{
    var notification = new MyNotification { Message = message };
    await _mediator.Publish(notification);  // 发布通知
    return Ok();
}

当收到 POST 请求时,我们创建并发布 MyNotification 通知,所有注册的处理程序都会处理该通知。

4. 管道行为(Pipeline Behavior)

MediatR 支持 管道行为(Pipeline Behavior),它允许你在请求和响应的生命周期中插入自定义逻辑。例如,你可以在请求之前或之后添加日志记录、验证、缓存等操作。

4.1 创建管道行为

管道行为实现 IPipelineBehavior<TRequest, TResponse> 接口,允许你控制请求的处理过程。

using MediatR;
using System;
using System.Threading;
using System.Threading.Tasks;

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        // 在请求之前执行的逻辑
        Console.WriteLine($"Handling {typeof(TRequest).Name}");

        // 调用下一个请求处理程序
        var response = await next();

        // 在响应之后执行的逻辑
        Console.WriteLine($"Handled {typeof(TResponse).Name}");
        return response;
    }
}

LoggingBehavior 中,我们在请求处理之前和之后分别记录了日志。

4.2 注册管道行为

Program.cs 文件中,使用依赖注入注册管道行为。

builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));

这使得每个请求都会经过管道行为处理。

5. 异常处理

MediatR 本身没有内置的异常处理机制,但你可以通过管道行为来处理异常。以下是一个简单的异常处理示例:

public class ExceptionHandlingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        try
        {
            return await next();
        }
        catch (Exception ex)
        {
            // 记录异常或进行其他处理
            Console.WriteLine($"An error occurred: {ex.Message}");
            throw;
        }
    }
}

然后,在 Program.cs 中注册此异常处理行为:

builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ExceptionHandlingBehavior<,>));

6. 总结

MediatR 是一个强大的库,帮助你实现松耦合、易扩展的请求/响应模式和通知模式。它在大多数应用场景中都非常有用,尤其是当你的应用程序逻辑比较复杂时。通过 MediatR,你可以更好地组织你的代码,使得不同的组件之间解耦,提高可维护性。

主要功能包括:

  • 请求/响应模式:通过请求类和处理程序来实现操作逻辑。
  • 通知模式:发布通知,多个处理程序同时处理同一条通知。
  • 管道行为:在请求生命周期中插入自定义逻辑,如日志记录、异常处理等。
  • 轻松集成:通过简单的依赖注入和配置,MediatR 可以轻松集成到 ASP.NET Core 应用中。

MediatR 通过实现中介者模式,不仅提高了代码的解耦性,还使得复杂的操作变得更加清晰和可扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值