2011-01-14 19 views
8

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?

+0

+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

Trả lời

4

Tôi gặp sự cố chính xác này trong miền của riêng mình (e-scheduling 4 healthcare). Về cơ bản hệ thống được cấu hình bằng cách sử dụng một mô hình miền (viết bên). Điều này sẽ xác định các quy tắc, sản phẩm và giá cơ sở trong miền của bạn. Cái gì ra khỏi miền? Sự kiện, thay đổi trạng thái, những điều đã xảy ra cùng với lý do tại sao nó xảy ra. Bây giờ những gì tôi đã làm là tiêu thụ những sự kiện này trong một bối cảnh ràng buộc khác nhau, trong trường hợp của tôi là một công cụ tìm kiếm phức tạp tìm các khe trống trong lịch trình của các bác sĩ, nhà hát và các thiết bị đắt tiền. Đây có thể là một lộ trình bạn có thể thực hiện, tiêu thụ sản phẩm, giá cơ sở và các sự kiện liên quan đến quy tắc và lưu trữ chúng theo cách mà công cụ quy tắc, ngồi trên đầu dữ liệu đó có thể xử lý yêu cầu của người dùng cho các tình huống hiệu quả như khả thi. Nhiều khả năng bạn sẽ thấy rằng mô hình để lưu trữ các thay đổi (tên miền) khác với mô hình được tối ưu hóa để truy vấn những kịch bản gì-if đó (công cụ quy tắc). Tên miền của bạn có thể có các quy tắc như "bạn không thể chỉ định cùng một sản phẩm hai lần" hoặc "quy tắc này sẽ không bao giờ được đối sánh (tuổi & age> 25)". Miền liên quan đến việc chỉ cho phép các thay đổi trạng thái hợp lệ. Đây không phải là một mối quan tâm của công cụ quy tắc. Bạn sẽ bị cám dỗ để sử dụng lại các khái niệm/lớp học trong công cụ quy tắc được xác định trong miền. Chống lại sự thôi thúc đó.Câu hỏi nếu họ thực sự phục vụ cùng một mục đích. Mô hình hóa nó hai lần cho một mục đích khác nhau không bị bẩn hoặc vi phạm DRY.

+0

Chỉ cần làm rõ, không có gì sai khi sử dụng phương pháp xử lý truy vấn, nơi các truy vấn được mô hình hóa như các đối tượng/thông điệp (giống như lệnh và sự kiện) và trình xử lý xử lý yêu cầu truy vấn đó và phát ra phản hồi truy vấn. Đây có thể là front-end cho công cụ quy tắc của bạn. –

+0

Cảm ơn phản ứng của bạn, Yves. Nhưng, tôi vẫn chưa rõ 100%. Vì vậy, tôi có 3 ngữ cảnh bị chặn ở đây? 1 - Mô hình miền (trạng thái quản lý ghi bên), 2 - Kịch bản thực thi kịch bản, 3 - Đọc mô hình cho giao diện người dùng - 2 và 3 là nô lệ đến 1. Và cả 3 đều có cơ chế kiên trì riêng? Cảm ơn - Kaan. – KaanK

+0

Câu trả lời ngắn gọn: Có. 3 mô hình riêng biệt phục vụ các mục đích khác nhau. Chỉ cần cắn viên đạn. –

0

CQRS không nói gì về việc không nên có logic miền trong phần truy vấn của ứng dụng. Nếu nó có thể và thực tế thì nó là ok để có riêng biệt các cửa hàng truy vấn không chuẩn hóa cho mọi khía cạnh hoặc thậm chí truy vấn của ứng dụng của bạn, nhưng tất nhiên nó không cần thiết.

Tóm lại, truy vấn là truy vấn, cho dù nhiệm vụ tìm kiếm câu trả lời là phức tạp đến mức nào.

Các vấn đề liên quan