+1

[Series AI] Cursor Rules và Demo cho Architecture Layers

Chào anh em! Rất vui được gặp lại anh em trong bài viết thứ 7 của series Cursor AI for Developers.

Ở bài trước, chúng ta đã cùng nhau "mổ xẻ" kiến trúc Lục giác (Hexagonal Architecture). Nghe thì rất sướng, nhưng thực tế khi triển khai, nhiều anh em than phiền rằng: "Hoàng ơi, AI nó cứ quên hoài! Lúc thì nó quăng logic DB vào Domain, lúc thì nó lại gọi Controller từ Service, sửa mệt quá!".

Vấn đề nằm ở chỗ: AI nhìn vào project của bạn như một đống file hỗn độn nếu bạn không vạch ra biên giới cho nó. Hôm nay, mình sẽ hướng dẫn anh em cách dùng Cursor Rules để phân tầng kiến trúc, biến AI thành một "giám sát viên" thực thụ cho từng Layer.

1. Tư duy "Chia để trị" trong Cursor Rules

Sai lầm của nhiều người là viết một file .cursorrules chung chung cho cả project. Với các project có cấu trúc Layers (Domain, Application, Infrastructure) chúng ta cần một cơ chế kiểm soát chặt chẽ hơn: Layer-Specific Guidelines.

Trong Cursor, bạn có thể định nghĩa các quy tắc để AI biết rằng:

  • Domain Layer là vùng "bất khả xâm phạm" (không được import bất kỳ thư viện ngoài nào).
  • Application Layer chỉ được phép gọi Domain.
  • Infrastructure Layer là nơi duy nhất được chứa các logic về SQL, Redis, hay Axios.

2. Thiết lập bộ khung Rules cho Architecture Layers

Hãy cập nhật file .cursorrules của anh em với cấu trúc phân tầng như sau. Đây là cách mình "onboard" AI cho các dự án phức tạp:

# Architecture Layers Enforcement

## 1. Domain Layer (@src/domain)
- **Trách nhiệm:** Chứa Business Entities và Domain Services.
- **Ràng buộc:** Tuyệt đối KHÔNG import từ các layer khác. Không phụ thuộc vào framework (Express, NestJS) hay Database.
- **Quy tắc:** Mọi logic nghiệp vụ cốt lõi phải nằm ở đây.

## 2. Application Layer (@src/application)
- **Trách nhiệm:** Chứa Use Cases và Orchestration logic.
- **Ràng buộc:** Chỉ được import từ Domain Layer. Không được chứa logic truy vấn DB trực tiếp.
- **Quy tắc:** Sử dụng Port (Interface) để giao tiếp với bên ngoài.

## 3. Infrastructure Layer (@src/infrastructure)
- **Trách nhiệm:** Hiện thực hóa các Ports (Adapters), DB Configuration, External API.
- **Ràng buộc:** Có thể import từ Domain và Application để thực thi Interface.
- **Quy tắc:** Đây là nơi duy nhất được dùng `TypeORM`, `Prisma`, hay `Mongoose`.

3. Demo: Sức mạnh của "Giám sát viên" AI

Thử xem sức mạnh của việc thiết lập rules này qua một tình huống thực tế:

Tình huống: Mình yêu cầu Cursor viết một function gửi email xác nhận khi user đăng ký thành công.

  • Nếu không có Rules: AI sẽ cài nodemailer ngay trong file register.service.ts (Application Layer) và viết code gửi mail loằng ngoằng tại đó. Sai kiến trúc hoàn toàn!
  • Khi có Rules bài bản:
  1. Cursor sẽ tự động tạo một Interface IEmailService trong lớp Application.
  2. Sau đó, nó đề xuất tạo một file NodemailerAdapter.ts trong lớp Infrastructure để thực thi (implement) interface đó.
  3. Cuối cùng, nó mới viết logic gọi emailService.send() trong Use Case.

4. Cách kiểm tra AI có tuân thủ Layer không?

Một mẹo nhỏ cho anh em: Sau khi AI gen code xong, hãy hỏi ngược lại nó một câu:

"Hãy kiểm tra lại đoạn code vừa rồi dựa trên các quy tắc Architecture Layers trong .cursorrules. Có vi phạm ràng buộc import nào không?"

Nhờ có bộ rules đã thiết lập, Cursor sẽ tự "check-var" chính mình. Nếu lỡ tay import sai lớp, nó sẽ tự động xin lỗi và refactor lại code đúng vị trí.

5. Tạm kết bài 7

Giao tiếp với AI cũng giống như quản lý một team dev. Bạn không thể đòi hỏi họ làm đúng nếu không có một bộ Coding Guideline rõ ràng. Với Cursor Rules cho từng Layer, anh em đã chính thức biến AI từ một "thợ gõ" thành một "Solution Architect" thực thụ, người hiểu rõ biên giới của từng dòng code.

Teaser Bài Tiếp Theo:

Tới đây, chúng ta đã tối ưu Cursor đến mức "kịch trần" về mặt IDE rồi. Nhưng thế giới AI không dừng lại ở đó. Anh em có bao giờ ước rằng Cursor có thể truy cập trực tiếp vào hệ thống Jira của team, đọc log từ server Google Cloud, hay tự động check giá coin trên Binance để viết code logic không?

Chào mừng anh em đến với "vũ trụ mở rộng" của AI. Ở buổi tới, chúng ta sẽ khám phá một chân trời mới: Custom Agents và MCP (Model Context Protocol) – Cách để kết nối Cursor với mọi dữ liệu trên thế giới.

👉 [Series Cursor AI - Bài 8] Buổi 8 – Custom Agents và MCP: Phá bỏ giới hạn của IDE

Anh em thấy việc phân tầng bằng Rules này có giúp code "sạch" hơn không? Hãy thử áp dụng vào project hiện tại và khoe thành quả dưới comment nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí