Gần đây tôi đã bắt đầu điều tra CQRS và DDD cho một dự án lĩnh vực xanh mà tôi sắp bắt đầu. Tôi đã nghiên cứu rất nhiều tài liệu từ Udi Dahan, Greg Young, Mark Nijhof và những người khác. Chúng thực sự rất hữu ích và tôi nghĩ rằng tôi có một sự hiểu biết tốt về các khái niệm. Nhưng, vẫn còn một số câu hỏi trong tâm trí của tôi về cách tôi có thể áp dụng chúng vào miền của riêng tôi.CQRS - cách mô hình hóa hệ thống thực hiện kịch bản
Hệ thống của tôi về cơ bản sẽ là một công cụ quy tắc phức tạp - trong đó quy tắc sẽ quyết định giá cuối cùng của một số sản phẩm nhất định. Các định nghĩa và quy tắc sản phẩm sẽ được quản trị viên nhập vào hệ thống. Quy tắc sẽ được thiết kế bởi quản trị viên sử dụng bộ thuộc tính được xác định trước có thể có giá trị từ tập hợp được xác định trước, chẳng hạn như 'Mục đích mua' (Bán lại, Cho thuê) hoặc các giá trị biểu mẫu miễn phí, chẳng hạn như Tuổi.
Mỗi sản phẩm sẽ có giá cơ sở và các quy tắc về cơ bản sẽ thêm/xóa khỏi giá cơ sở nếu chúng áp dụng.
Một nguyên tắc mẫu rất đơn giản có thể là:
Đối với sản phẩm X, NẾU (Mua Mục đích = Bán lại và Tuổi> 25) Thêm 25 $ đến giá cơ sở.
Vì vậy, có 2 loại người dùng sử dụng hệ thống, quản trị viên, người xác định sản phẩm, quy tắc và giá cơ sở; và những người dùng khác truy vấn định giá dựa trên một kịch bản mà họ nhập vào thông qua giao diện người dùng nếu là gì. Sự nhầm lẫn của tôi ở đây là: chạy một kịch bản không thay đổi trạng thái của tên miền, không có hệ thống/người bên ngoài nào quan tâm đến kết quả của việc thực thi kịch bản nhưng bản thân người dùng đang chạy - nó trả về giá trị kết quả của việc tính toán giá sau khi chạy các quy tắc áp dụng cho kịch bản đã cho. Ví dụ: người dùng có thể chọn Sản phẩm X và truy vấn giá cho một trường hợp nhất định, chẳng hạn như (Mua mục đích = Bán lại và Tuổi = 40). Một lần nữa, vì thao tác này không thay đổi trạng thái miền, tôi đoán đó là truy vấn. Nhưng, có một công cụ quy tắc hoạt động trên kịch bản để tính giá cuối cùng, mà tôi đoán có thể được phân loại là logic miền đang được chạy. Vậy logic này thuộc về đâu? Đây có phải là truy vấn chỉ hoạt động ngoài mô hình đã đọc hay đang chạy một kịch bản lệnh cần được chạy trong mô hình miền không? Một lần nữa, nó cảm thấy như lớp miền là nơi dành cho các quy tắc này, nhưng sau đó làm cách nào để chuyển kết quả của việc thực thi kịch bản cho người dùng (cảm thấy giống như một truy vấn suy nghĩ về nó theo cách này). Hoặc có thể, CQRS không phải là giải pháp phù hợp cho vấn đề cụ thể này?
+1 cho tôi biết rằng có mẫu [cqrs] (http://blog.fossmo.net/post/Command-and-Query-Responsibility-Sregregation-%28CQRS%29.aspx) mà tôi chưa bao giờ nghe trước. – k3b