📅  最后修改于: 2023-12-03 15:02:55.414000             🧑  作者: Mango
MediatR 是一个轻量级的中介者库,用于简化多个类之间的通信和处理。它基于 CQRS(命令与查询职责分离)模式,可以使你的代码更加模块化、易于维护。
在本文中,我们将学习如何在 .NET Core 应用程序中使用 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,我们可以使我们的代码更加模块化、可组合和易于测试。