Giới Thiệu Mẫu CQRS và Lợi Ích Của Nó Trong Ứng Dụng .NET Core
Mẫu CQRS (Command Query Responsibility Segregation) là một phương pháp thiết kế phần mềm quan trọng giúp phân tách trách nhiệm xử lý các lệnh và truy vấn. Điều này có nghĩa là việc quản lý cách đọc và ghi dữ liệu được thực hiện bởi các thành phần khác nhau, giúp cải thiện hiệu suất và khả năng mở rộng của ứng dụng.
Trong bối cảnh phát triển phần mềm hiện đại, việc sử dụng một mô hình duy nhất để xử lý cả đọc và ghi thường không hiệu quả. CQRS chia mô hình thành hai phần: Lệnh (Commands) để thay đổi trạng thái và Truy vấn (Queries) để đọc dữ liệu. Việc áp dụng CQRS giúp đơn giản hóa thiết kế của hệ thống phức tạp, cho phép lập trình viên tối ưu hóa từng mô hình theo các yêu cầu riêng biệt của nó.
I. Kiến Trúc Cơ Bản Của Mẫu CQRS
1. Lệnh (Command)
Lệnh là các chỉ thị thể hiện một thay đổi mong muốn trong trạng thái của một thực thể trong hệ thống. Các lệnh như Thêm, Cập nhật và Xóa không trả về dữ liệu mà thay vào đó thay đổi trạng thái của ứng dụng. Mỗi lệnh có thể chứa tên hoạt động và dữ liệu cần thiết để thực hiện. Các CommandHandlers sẽ xử lý những lệnh này và trả về sự kiện phù hợp, cho biết lệnh đó đã thành công hay thất bại.
2. Truy Vấn (Query)
Truy vấn được sử dụng để lấy thông tin từ cơ sở dữ liệu mà không thực hiện bất kỳ thay đổi nào đối với nó. Query chỉ bao gồm các phương thức xác định để đọc dữ liệu và trả về cho người dùng. Các QueryHandlers sẽ xử lý các truy vấn này và trả về kết quả mong muốn.
CQRS rất hữu ích trong các ứng dụng yêu cầu hiệu suất cao, khả năng mở rộng tốt, chẳng hạn như web thương mại điện tử, hệ thống tài chính và phân tích dữ liệu thời gian thực.
Lợi ích lớn nhất của CQRS là nó giúp giảm thiểu sự phức tạp không cần thiết trong thiết kế hệ thống. Mô hình lệnh có thể được tối ưu hóa cho việc ghi dữ liệu, trong khi mô hình truy vấn có thể được tối ưu hóa cho việc đọc dữ liệu. Ví dụ, trong một ứng dụng thương mại điện tử, mô hình lệnh sẽ xử lý yêu cầu thêm, sửa hoặc xóa sản phẩm, trong khi mô hình truy vấn sẽ quản lý việc lấy thông tin sản phẩm.
II. Triển Khai CQRS Trong .NET Core Sử Dụng MediatR
1. Cài Đặt MediatR
Để sử dụng MediatR, bạn cần cài đặt thư viện này thông qua NuGet. Có thể thực hiện như sau:
Install-Package MediatR
2. Định Nghĩa Các Lệnh và Truy Vấn
csharp
// Lệnh thêm sản phẩm
public class AddProductCommand : IRequest
{
public string Name { get; set; }
public decimal Price { get; set; }
}
// Truy vấn lấy thông tin sản phẩm
public class GetProductQuery : IRequest<Product>
{
public int ProductId { get; set; }
}
3. Triển Khai Các Xử Lý Lệnh và Truy Vấn
csharp
public class AddProductCommandHandler : IRequestHandler<AddProductCommand>
{
private readonly IProductRepository _productRepository;
public AddProductCommandHandler(IProductRepository productRepository)
{
_productRepository = productRepository;
}
public async Task<Unit> Handle(AddProductCommand request, CancellationToken cancellationToken)
{
var product = new Product
{
Name = request.Name,
Price = request.Price
};
await _productRepository.AddAsync(product);
return Unit.Value;
}
}
public class GetProductQueryHandler : IRequestHandler<GetProductQuery, Product>
{
private readonly IProductRepository _productRepository;
public GetProductQueryHandler(IProductRepository productRepository)
{
_productRepository = productRepository;
}
public async Task<Product> Handle(GetProductQuery request, CancellationToken cancellationToken)
{
return await _productRepository.GetByIdAsync(request.ProductId);
}
}
4. Đăng Ký Các Dịch Vụ
Để đăng ký MediatR, thêm đoạn mã sau vào phương thức ConfigureServices
trong lớp Startup
:
services.AddMediatR(typeof(Startup)); // Đăng ký tất cả các xử lý trong dự án
5. Sử Dụng MediatR Trong Ứng Dụng
Trong lớp controller, bạn có thể sử dụng MediatR để gửi các lệnh hoặc truy vấn như sau:
csharp
public class ProductController : ControllerBase
{
private readonly IMediator _mediator;
public ProductController(IMediator mediator)
{
_mediator = mediator;
}
[HttpPost]
public async Task<IActionResult> AddProduct(AddProductCommand command)
{
await _mediator.Send(command);
return Ok();
}
[HttpGet("{productId}")]
public async Task<IActionResult> GetProduct(int productId)
{
var query = new GetProductQuery { ProductId = productId };
var product = await _mediator.Send(query);
return Ok(product);
}
}
Trên đây là cách cơ bản để triển khai mẫu CQRS sử dụng MediatR trong ứng dụng .NET Core của bạn. Hãy nhớ xây dựng các lớp repository và model phù hợp với nhu cầu cụ thể của ứng dụng để đạt hiệu quả tối ưu.
Lời Kết
Cuối cùng, nhân dịp năm mới, mình xin gửi lời chúc tốt đẹp nhất đến toàn thể cộng đồng Viblo và những người dùng trên nền tảng này. Chúc mọi người một năm mới an khang thịnh vượng, vạn sự như ý và tràn đầy hạnh phúc!
source: viblo