Command and Query Responsibility Segregation(CQRS) là một pattern phân tách read và write dữ liệu. Query sẽ tiến hành đọc dữ liệu và Command  sẽ thực hiện các lệnh đến database như Insert/Update hoặc Delete.

CQRS

Một vài ưu điểm của CQRS:

  • Dễ mở rộng
  • Tối ưu các dữ liệu được truyền tải
  • Mở rộng độc lập các thành phần (Read/Write)

Triển khai CQRS bằng thư viện MediatR giúp ta triển khai Mediator pattern trong .Net. Đây là một behavioral pattern giúp giảm sự phụ thuộc giữa các đối tượng bằng cách hạn chế giao tiếp giữa các đối tượng bằng cách giao tiếp qua các đối tượng trung gian.

Bắt đầu

Mở Visual Studio, tạo project với ASP.NET Core Web API.

Screenshot 2021 09 04 040127 1

Cài đặt các packages cần thiết

Tạo structure cho project

Screenshot 2021 09 04 042227

Trong thư mục Models, chúng ta tạo class Student

Trong thư mục DataAccess, chúng ta sẽ tiến hành viết class xử lý dữ liệu, để đơn giản, chúng ta sẽ viết các phương thức giả lập thao tác với database.

Tạo Query

Trong thư mục Queries, chúng ta tiến hành viết tất cả query trong này. Tiến hành thêm class GetStudentListQuery bên trong thư mục Queries.

GetStudenListQuery sẽ implements interface IRequest để thư viện MediatR biết là class này là một query hay command. GetStudentListQuery  sẽ trả về cho chúng ta danh sách Student, nên ta sẽ truyền  List<Student> vào generic interface.

Tạo Handler

Mỗi request (Query/Command) đều sẽ cần một handler cho chính nó. Handler sẽ xác định các việc cần làm khi nhận yêu cầu từ client. Chúng ta sẽ tiến hành tạo GetStudentListHandler trong thư mục Handlers để định nghĩa handler cho GetStudentListQuery.

Handler sẽ implement  IRequestHandler với hai tham số, tham số đầu tiên là tên request sẽ xử lý, tham số thứ hai sẽ là kết quả trả về của request.

Tạo Command

Trong thư mục Commands, chúng ta sẽ tạo AddStudentCommand để thực hiện insert student.

Tiến hành tạo handler cho cho command

Cấu hình dependency

Mở class startup.cs tại phương thức ConfigureServices() chúng ta sẽ tiến hành đăng ký services cho MediatR.

Thêm Controller

Bây giờ chúng ta sẽ tạo StudentController.

Khi gọi phương thức _mediator.Send() và truyền vào tên request, mediator sẽ gọi tới handler tương ứng của request. Về cơ bản, controller sẽ không cần biết bất kỳ implement, điều đó giúp controller sẽ clean hơn, mọi xử lý phức tạp đẵ được Mediator quản lý.

Run app với swagger và xem thành quả

Screenshot 2021 09 04 051924

Phạm Hoài Thương

Software Engineer

About the Author

Creating an application is easy, but creating a Great, Production-Ready Application is a whole different story. Một thợ code đang mong muốn trở thành một kỹ sư thực thụ. Đây là nơi tôi chia sẽ những kiến thức tôi đọc qua hoặc trải nghiệm cảm thấy hay ho.

View Articles