asp.net core中MediatR如何使用

发布时间:2021-07-15 14:23:33 作者:Leah
来源:亿速云 阅读:374

ASP.NET Core 中 MediatR 如何使用

在现代的 ASP.NET Core 应用程序中,随着业务逻辑的复杂性增加,代码的组织和维护变得越来越重要。为了保持代码的整洁和可维护性,开发者通常会采用一些设计模式和工具来解耦业务逻辑。MediatR 是一个流行的库,它实现了中介者模式(Mediator Pattern),帮助我们在 ASP.NET Core 中更好地组织和管理请求和响应的处理逻辑。

本文将详细介绍如何在 ASP.NET Core 中使用 MediatR,包括安装、配置、创建请求和处理器、以及如何处理通知和管道行为。

1. 什么是 MediatR?

MediatR 是一个轻量级的库,它实现了中介者模式,允许你将请求和响应的处理逻辑解耦。通过使用 MediatR,你可以将业务逻辑从控制器中分离出来,使代码更加模块化和易于测试。

MediatR 的核心概念包括:

2. 安装 MediatR

首先,你需要在 ASP.NET Core 项目中安装 MediatR 和 MediatR.Extensions.Microsoft.DependencyInjection 包。你可以通过 NuGet 包管理器或命令行工具来安装:

dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection

3. 配置 MediatR

安装完成后,你需要在 Startup.csProgram.cs 中配置 MediatR。如果你使用的是 .NET 6 或更高版本,通常在 Program.cs 中进行配置:

var builder = WebApplication.CreateBuilder(args);

// 添加 MediatR 服务
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

var app = builder.Build();

// 其他中间件配置

app.Run();

在这个配置中,AddMediatR 方法会自动扫描指定程序集中的所有请求处理器和通知处理器,并将它们注册到依赖注入容器中。

4. 创建请求和处理器

4.1 定义请求

首先,你需要定义一个请求。请求是一个简单的类,通常实现 IRequest<TResponse> 接口。例如,假设我们有一个获取用户信息的请求:

public class GetUserByIdQuery : IRequest<User>
{
    public int UserId { get; set; }
}

在这个例子中,GetUserByIdQuery 是一个请求,它返回一个 User 对象。

4.2 创建处理器

接下来,你需要创建一个处理器来处理这个请求。处理器是一个类,实现 IRequestHandler<TRequest, TResponse> 接口。例如:

public class GetUserByIdQueryHandler : IRequestHandler<GetUserByIdQuery, User>
{
    private readonly IUserRepository _userRepository;

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

    public async Task<User> Handle(GetUserByIdQuery request, CancellationToken cancellationToken)
    {
        return await _userRepository.GetUserByIdAsync(request.UserId);
    }
}

在这个处理器中,我们通过依赖注入获取了 IUserRepository,并在 Handle 方法中处理了请求。

4.3 在控制器中使用 MediatR

现在,你可以在控制器中使用 MediatR 来发送请求并获取响应。例如:

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

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

    [HttpGet("{id}")]
    public async Task<ActionResult<User>> GetUserById(int id)
    {
        var query = new GetUserByIdQuery { UserId = id };
        var user = await _mediator.Send(query);

        if (user == null)
        {
            return NotFound();
        }

        return Ok(user);
    }
}

在这个控制器中,我们通过 IMediator 发送了 GetUserByIdQuery 请求,并返回了处理结果。

5. 处理通知

除了请求/响应模型,MediatR 还支持通知。通知是一种广播机制,允许多个处理器处理同一个通知。

5.1 定义通知

首先,你需要定义一个通知。通知是一个简单的类,通常实现 INotification 接口。例如:

public class UserCreatedNotification : INotification
{
    public int UserId { get; set; }
}

5.2 创建通知处理器

接下来,你需要创建一个或多个通知处理器。通知处理器是一个类,实现 INotificationHandler<TNotification> 接口。例如:

public class UserCreatedNotificationHandler : INotificationHandler<UserCreatedNotification>
{
    public async Task Handle(UserCreatedNotification notification, CancellationToken cancellationToken)
    {
        // 处理通知逻辑
        Console.WriteLine($"User created with ID: {notification.UserId}");
    }
}

5.3 发送通知

你可以在任何地方使用 IMediator 来发送通知。例如:

public class CreateUserCommandHandler : IRequestHandler<CreateUserCommand, int>
{
    private readonly IMediator _mediator;

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

    public async Task<int> Handle(CreateUserCommand request, CancellationToken cancellationToken)
    {
        // 创建用户的逻辑
        var userId = 1; // 假设创建用户后返回的 ID 是 1

        // 发送通知
        await _mediator.Publish(new UserCreatedNotification { UserId = userId });

        return userId;
    }
}

在这个例子中,当用户创建成功后,我们发送了一个 UserCreatedNotification 通知。

6. 使用管道行为

MediatR 还支持管道行为,允许你在请求处理前后执行一些逻辑。管道行为通常用于日志记录、验证、性能监控等场景。

6.1 定义管道行为

首先,你需要定义一个管道行为。管道行为是一个类,实现 IPipelineBehavior<TRequest, TResponse> 接口。例如:

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;

    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger;
    }

    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        _logger.LogInformation($"Handling {typeof(TRequest).Name}");

        var response = await next();

        _logger.LogInformation($"Handled {typeof(TResponse).Name}");

        return response;
    }
}

在这个管道行为中,我们在请求处理前后记录了日志。

6.2 注册管道行为

你需要在 Startup.csProgram.cs 中注册管道行为。例如:

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

6.3 使用管道行为

注册完成后,管道行为会自动应用到所有的请求处理中。你不需要在代码中显式调用管道行为。

7. 总结

MediatR 是一个强大的工具,它帮助我们在 ASP.NET Core 中更好地组织和管理请求和响应的处理逻辑。通过使用 MediatR,我们可以将业务逻辑从控制器中分离出来,使代码更加模块化和易于测试。本文介绍了如何在 ASP.NET Core 中安装、配置和使用 MediatR,包括创建请求和处理器、处理通知以及使用管道行为。希望这些内容能帮助你在实际项目中更好地使用 MediatR。

推荐阅读:
  1. 怎么在Asp.net core中利用MediatR实现进程内发布/订阅功能
  2. ASP.NET Core Kestrel中如何使用HTTPS

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mediatr asp.net core

上一篇:python中二维数组及画图的示例分析

下一篇:C#事件处理机制和自定义事件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》