Trong lập trình với C#, MediatR là một thư viện phổ biến giúp đơn giản hóa quá trình thực hiện các yêu cầu và xử lý phản hồi bằng cách sử dụng mô hình trung gian (mediator pattern). Điều này giúp tách biệt rõ ràng giữa các lớp xử lý, giảm phụ thuộc và tăng khả năng mở rộng của ứng dụng. Bài viết này sẽ cung cấp một cái nhìn tổng quan về cách sử dụng MediatR trong dự án C# của bạn.
Giới thiệu về MediatR
MediatR là một thư viện cho phép bạn triển khai mô hình trung gian để xử lý các yêu cầu (requests) và lệnh (commands) trong ứng dụng của mình. Mô hình này hoạt động bởi việc gửi các yêu cầu đi qua một trung gian, điều phối các handler tương ứng để xử lý và trả lại kết quả cho người gửi.
Bắt đầu với MediatR
Để bắt đầu, bạn cần cài đặt thư viện MediatR thông qua NuGet Package Manager. Bạn có thể thực hiện điều này bằng cách nhập lệnh sau trong Package Manager Console:
Install-Package MediatR
Install-Package MediatR.Extensions.Microsoft.DependencyInjection
Định nghĩa các yêu cầu và phản hồi
Bước đầu tiên là định nghĩa các yêu cầu (request) và phản hồi (response). Một yêu cầu thông thường là một lớp (class) implement interface IRequest<TResponse> nếu bạn mong muốn có phản hồi, hoặc IRequest nếu không cần phản hồi.
public class Ping : IRequest<Pong>
{
public string Message { get; set; }
}
public class Pong
{
public string Reply { get; set; }
}
Tạo các handler
Tiếp theo, bạn cần tạo các handler để xử lý các yêu cầu này bằng cách implement IRequestHandler<TRequest, TResponse> hoặc IRequestHandler<TRequest>.
public class PingHandler : IRequestHandler<Ping, Pong>
{
public Task<Pong> Handle(Ping request, CancellationToken cancellationToken)
{
return Task.FromResult(new Pong { Reply = "Pong: " + request.Message });
}
}
Đăng ký MediatR trong Dependency Injection Container
Bạn sẽ cần đăng ký MediatR và các handler trong Dependency Injection Container của ứng dụng. Trong ASP.NET Core, điều này có thể thực hiện trong Startup.cs hoặc Program.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMediatR(typeof(Startup));
// Các dịch vụ khác
}
Gửi yêu cầu từ các controller hoặc service
Để gửi một yêu cầu từ các controller hoặc service, bạn cần inject IMediator và gọi phương thức Send:
public class HomeController : Controller
{
private readonly IMediator _mediator;
public HomeController(IMediator mediator)
{
_mediator = mediator;
}
public async Task<IActionResult> Index()
{
var response = await _mediator.Send(new Ping { Message = "Hello" });
ViewBag.Message = response.Reply;
return View();
}
}
Lợi ích của việc sử dụng MediatR
- Tách biệt logic nghiệp vụ: Mọi logic nghiệp vụ phức tạp đều được “tách biệt” vào các handler, giúp code trong controller hoặc service ngắn gọn và dễ hiểu hơn.
- Tăng khả năng mở rộng và bảo trì: Các module của ứng dụng được phân tách rõ ràng, dễ dàng mở rộng hoặc sửa chữa mà không làm ảnh hưởng tới toàn bộ hệ thống.
- Thân thiện với mô hình microservices: MediatR giúp triển khai các mô hình thiết kế hướng sự kiện, rất phù hợp với mô hình microservices.
Kết luận
Việc triển khai MediatR trong dự án C# không chỉ giúp đơn giản hóa quá trình quản lý các yêu cầu và phản hồi mà còn cung cấp một cấu trúc rõ ràng, dễ mở rộng và ít rủi ro. Với MediatR, bạn có thể dễ dàng quản lý logic nghiệp vụ và tăng hiệu suất phát triển ứng dụng. Nếu bạn chưa thử sử dụng MediatR, đây có thể là cơ hội tuyệt vời để cải tiến kiến trúc dự án hiện tại của bạn.
Comments