Triển khai CQRS trên ASP .NET Core dùng MediatR

CQRS (Command Query Responsibility Segregation) là một pattern cho việc xử lý CRUD dữ liệu. Trong đó chia việc tương tác với dữ liệu thành 2 thành phần Command và Query. Hai thành phần này tách biệt và độc lập với nhau.
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ầu
Visual 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, InsomniaAdvanced 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 ...