MediatR là một thư viện cực kỳ hữu ích cho việc quản lý luồng dữ liệu trong các ứng dụng C# hiện đại. Thư viện này cung cấp một mô hình kiến trúc đơn giản nhưng mạnh mẽ, giúp tách biệt rõ ràng giữa các thành phần trong ứng dụng, từ đó nâng cao khả năng bảo trì và mở rộng.
Khái niệm cơ bản
MediatR là một implement của mẫu thiết kế Mediator. Nó đóng vai trò như một người điều phối, trung gian giữa các class khác nhau, giúp giảm thiểu sự phụ thuộc giữa các class. Điều này không chỉ giúp code dễ đọc và dễ bảo trì hơn mà còn làm tăng tính modul của ứng dụng.
Cài đặt MediatR
Để bắt đầu sử dụng MediatR, trước tiên bạn cần cài đặt thư viện này. Bạn có thể thêm MediatR vào dự án của mình thông qua NuGet Package Manager Console hoặc Package Manager UI.
Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection
Hoặc bạn có thể thêm trực tiếp vào file .csproj của mình:
<PackageReference Include="MediatR" Version="10.0.1" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="10.0.1" />
Đăng ký MediatR trong ứng dụng
Sau khi cài đặt, bạn cần đăng ký MediatR như một dịch vụ trong Startup.cs (nếu bạn sử dụng ASP.NET Core):
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddMediatR(typeof(Startup)); // Đăng ký MediatR
}
Tạo Request và Handler
MediatR làm việc với các khái niệm Request và Handler. Request đại diện cho hành động hoặc câu hỏi yêu cầu một kết quả cụ thể, trong khi Handler là nơi xử lý Request đó.
Tạo một Request
Đầu tiên, bạn cần định nghĩa một Request. Ví dụ:
public class GetUserByIdQuery : IRequest<User>
{
public int UserId { get; set; }
public GetUserByIdQuery(int userId)
{
UserId = userId;
}
}
Tạo Handler
Sau đó, bạn cần tạo một Handler để xử lý Request này:
public class GetUserByIdHandler : IRequestHandler<GetUserByIdQuery, User>
{
private readonly IUserRepository _userRepository;
public GetUserByIdHandler(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public async Task<User> Handle(GetUserByIdQuery request, CancellationToken cancellationToken)
{
return await _userRepository.GetByIdAsync(request.UserId);
}
}
Sử dụng MediatR trong Controller
Khi đã có Request và Handler, bạn có thể sử dụng MediatR trong Controller để gọi các hành động này:
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IMediator _mediator;
public UsersController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet("{id}")]
public async Task<IActionResult> GetUserById(int id)
{
var query = new GetUserByIdQuery(id);
var user = await _mediator.Send(query);
return Ok(user);
}
}
Lợi ích MediatR mang lại
- Giảm Sự Phụ Thuộc: MediatR giúp giảm thiểu sự phụ thuộc giữa các thành phần của hệ thống.
- Dễ Dàng Bảo Trì: Tách biệt rõ ràng các logic xử lý giúp code dễ hiểu và dễ bảo trì hơn.
- Tăng Tính Mở Rộng: Khi cần thêm tính năng mới, bạn chỉ cần định nghĩa thêm các Request và Handler mới mà không phải sửa đổi code cũ.
Kết luận
Việc sử dụng MediatR trong ứng dụng C# không chỉ giúp quản lý luồng dữ liệu một cách hiệu quả mà còn nâng cao tính linh hoạt và khả năng mở rộng. Thông qua một hệ thống rõ ràng và cực kỳ lin...<|vq_3821|>
Comments