Query trả về data mà không thay đổi trạng thái của hệ thống
Command thay đổi trạng thái của hệ thống nhưng không trả về data
Trong thực tế thiết kế hệ thống theo mô hình microservices người ta thương kết hợp CQRS với Event Sourcing
Để hiểu thêm về lý thuyết các bạn có thể tham khảo một số đường links ở cuối bài biết
Cài đặt CQRS cho ASP .NET Core
Yêu cầuVisual Studio 2019 or Visual Studio Code
.NET Core SDK
Ở đây để đơn giản mình chỉ tạo một project và đưa hết code vào trong đó. Trên thực tế bạn phải chia thành các modules và layers sẽ dễ cho việc quản lý hơn.
Các bạn có thể tham khảo và tải về code mẫu ở đây
Khởi tạo project
dotnet new webapi -o CQRSTest
Cài đặt các packages cần thiết
https://www.nuget.org/packages/FluentValidation.AspNetCore
https://www.nuget.org/packages/MediatR
https://www.nuget.org/packages/MediatR.Extensions.Microsoft.DependencyInjection
dotnet add package FluentValidation.AspNetCore
dotnet add package MediatR
dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
Việc implement CQRS có thể tự triển khai viết code. Ở đây để tiện thì mình có sử dụng thư viện MediatR.
FluentValidation dùng cho việc validate kiểm tra dữ liệu trước khi xử lý.
Về cơ bản để thực hiện một tương tác Query hoặc Command ta định nghĩa lần lượt các các class sau
Khai báo class ...Command.cs hoặc ...Query.cs dùng định nghĩa các parameters cần thiết cho object truyền vào. Class này kế thừa từ IRequest trong MediatR.
Khai báo class ...CommandHandler.cs hoặc ...QueryHandler.cs kế thừa từ IRequestHandler và thực thi interface Handle trong thư viện MediatR. Việc CRUD dữ liệu sẽ được định nghĩa ở đây.
Với các tương tác cần validate dữ liệu đầu vào thì khai báo thêm class ...CommandValidator.cs hoặc ...QueryValidator.cs kế thừa từ AbstractValidator trong thư viện FluentValidation và khai báo hết các validates vào contructor của class này.
Với Query thì ta có trả về dữ liệu nên ta cần khai báo các ViewModel để trả về dữ liệu mà ta mong muốn hiển thị lên View
Cấu hình MediatR và FluentValidation trong Startup.cs
Việc định nghĩa CQRS coi như đã hoàn tất. Ở đây đưa ví dụ sử dụng CQRS trên controllers
Khởi chạy ứng dụng và tiền hành kiểm tra
cd CQRSTest
dotnet run
Vào đường dẫn sau để kiểm tra kết quả lấy về tất cả các Customers
http://localhost:5000/api/customers
Với các API phức tạp cần truyền tham số hoặc dữ liệu bạn nên dùng các công cụ khác ngoài trình duyệt (Postman, Insomnia, Advanced REST Client, ...) hoặc sử dụng các extensions trên trình duyệt
Ở đây mình có sử dụng REST Client extension trên Visual Studio Code
Sau khi cài đặt REST Client bạn có thể dùng file dưới đây để có thể tiện kiểm tra API hơn
Tham khảo thêm
https://martinfowler.com/bliki/CQRS.html
https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs
https://herbertograca.com/2017/10/19/from-cqs-to-cqrs
https://dzone.com/articles/microservices-with-cqrs-and-event-sourcing
Tiếp tục cập nhật ...