📜  mediatr 依赖注入 (1)

📅  最后修改于: 2023-12-03 15:02:55.414000             🧑  作者: Mango

MediatR 依赖注入

MediatR Logo

MediatR 是一个轻量级的中介者库,用于简化多个类之间的通信和处理。它基于 CQRS(命令与查询职责分离)模式,可以使你的代码更加模块化、易于维护。

在本文中,我们将学习如何在 .NET Core 应用程序中使用 MediatR 并进行依赖注入。

安装 MediatR

MediatR 是一个 NuGet 包,可以通过 NuGet 程序包管理器或命令行安装:

Install-Package MediatR
定义请求和处理程序

首先,我们需要定义我们的请求和处理程序。在 MediatR 中,我们将请求称为消息,并将请求处理程序称为处理器。

下面是一个简单的登录请求和处理程序的示例:

public class LoginRequest : IRequest<User>
{
    public string Username { get; set; }
    public string Password { get; set; }
}

public class LoginRequestHandler : IRequestHandler<LoginRequest, User>
{
    private readonly IUserRepository _userRepository;

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

    public async Task<User> Handle(LoginRequest request, CancellationToken cancellationToken)
    {
        var user = await _userRepository.GetUserByUsernameAndPassword(request.Username, request.Password);

        if (user == null)
        {
            throw new Exception("Invalid username or password");
        }

        return user;
    }
}

LoginRequest 继承自 IRequest<User> 接口,该接口指定了请求的返回类型。LoginRequestHandler 实现了 IRequestHandler<LoginRequest, User> 接口,该接口指定了处理程序的输入类型和返回类型,并实现了 Handle 方法来处理请求。

在该示例中,我们注入了一个 IUserRepository,以便处理程序可以从数据库中获取用户信息。

配置依赖注入

在 .NET Core 应用程序中,我们使用 IServiceCollection 接口来配置依赖注入。为了使用 MediatR,我们需要将其自身服务和请求处理程序的服务添加到 IServiceCollection 中。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddMediatR(typeof(Startup));
    services.AddTransient<IUserRepository, UserRepository>();
}

在这里,我们定义了 MediatR 所需的服务,并注入了一个 IUserRepository 实例。

发送请求

现在,我们可以使用 MediatR 来发送请求并处理响应。以下是如何在控制器中使用 IMediator 来发送 LoginRequest 请求的示例:

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

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

    [HttpPost("login")]
    public async Task<IActionResult> Login(LoginRequest loginRequest)
    {
        var user = await _mediator.Send(loginRequest);

        return Ok(user);
    }
}

在这里,我们注入了一个 IMediator 实例,并将 LoginRequest 对象传递给 Send 方法,该方法将请求发送到处理程序并返回响应。

结论

MediatR 是一个强大而简单的中介者库,可以在 .NET Core 应用程序中轻松实现依赖注入。通过使用 MediatR,我们可以使我们的代码更加模块化、可组合和易于测试。