2009-12-10 26 views
21

Một trong những nguyên lý cơ bản của CQRS, như tôi hiểu, là các lệnh nên tập trung vào hành vi và có giá trị trong doanh nghiệp hoặc UL và không tập trung vào dữ liệu, tức là CRUD . Thay vì tập trung vào việc cập nhật một khách hàng, chúng tôi có các lệnh như CustomerHasMoved. Điều gì xảy ra nếu bạn có màn hình CRUD ở đó để sửa một số dữ liệu nhất định. Ví dụ: chúng tôi cần thay đổi tên của khách hàng bị viết sai chính tả. Điều này thực sự không có nhiều giá trị trong kinh doanh. Điều này có nên được đặt dưới sự bảo trợ của lệnh UpdateCustomer không?Màn hình CQRS và CRUD

+4

Làm cách nào để có đúng tên khách hàng không có giá trị cho doanh nghiệp? Lấy tên sai có thể có nghĩa là hàng hóa không được giao và có các tình huống khác ... – Oded

Trả lời

17

Thực tế, có thể có nhiều lý do khác nhau để cập nhật tên của khách hàng. Như bạn đã nói, nó có thể sai chính tả hoặc ... bạn có thể kết hôn và đổi tên thành chồng của bạn.

Nếu bạn chỉ có lệnh UpdateCustomer, bạn sẽ mất ý định ban đầu và bạn sẽ không thể có các hành vi khác nhau cho mỗi người trong số họ. Nếu tên đã bị viết sai, nó có thể đơn giản như cập nhật cơ sở dữ liệu, trong khi nếu khách hàng của bạn kết hôn, bạn có thể cần phải thông báo về việc khởi hành tiếp thị để họ có thể giảm giá.

Trong trường hợp thực thể của bạn hoàn toàn là CRUD, đó là không có ý định mà bạn có thể liên kết với việc sửa đổi các thuộc tính, sau đó có thể có UpdateEntityCommand. Sau đó, bạn có thể chuyển từ từ sang một số công việc khác dựa trên

+1

Chính xác, vậy bạn phải làm gì? Tạo một lệnh cho mỗi kịch bản có thể có? – blockhead

+7

Có hoặc ít nhất cho mỗi trường hợp bạn muốn xử lý. Trong ví dụ của tôi, bạn sẽ bắt đầu với CorrectMisspelledCustomerName sau đó, nếu bạn cần, bạn sẽ thêm một lệnh MakeCustomerMarried. CQRS là về hành vi, không phải về cập nhật dữ liệu. Do đó, bạn không nên có các lệnh chung để cập nhật nội dung trong hệ thống của mình – Julien

+0

Điều gì sẽ xảy ra nếu tôi có màn hình lớn với tất cả các trường cho khách hàng của mình. Tôi sẽ bắn ra một số lệnh để xử lý điều đó, hoặc bằng cách nào đó đưa ra một số loại "hành vi" cho điều đó. Có lẽ tôi chỉ nên không bao giờ hiển thị tất cả các lĩnh vực. – blockhead

0

CustomerHasMoved là sự kiện được kích hoạt sau khi bạn đã cập nhật vị trí của khách hàng. Sự kiện này cập nhật cơ sở dữ liệu đọc/cơ sở dữ liệu bộ đệm. Lệnh từ gui nên là MoveCustomer hoặc một cái gì đó như thế. Tôi nghĩ rằng tôi sẽ đặt bản cập nhật của tên khách hàng trong một lệnh như UpdateCustomer.

37

Tôi chỉ muốn đưa ra nhận xét về điều này một cách nhanh chóng khi nó xuất hiện.

Điều quan trọng cần lưu ý là một số đối tượng thực sự là CRUD và đó là ok. Tôi có thể không thực sự quan tâm lý do tại sao một tên đang thay đổi trong tên miền của tôi, nơi tôi gửi sản phẩm cho mọi người và chỉ cần dữ liệu đó để in nhãn gửi thư. Bí quyết là làm cho hành vi mặc định và THEN trở lại giao diện CRUD một khi bạn chắc chắn bạn thực sự không quan tâm đến những lý do trái ngược với ngược lại.

Greg

+0

Cảm ơn bạn đã nhập @Greg. Tôi đã googling trên tất cả để xem những gì bạn đã nói về các loại kịch bản CRUD. Tôi đoán CRUD thường xuyên vẫn là ok để sử dụng trong một cách tiếp cận DDD, miễn là hoàn toàn không có hành vi bạn muốn chụp cùng với nó. –

+0

Upvote. Chúng tôi đang tiêu tiền ở đây để có được chức năng (với khả năng duy trì thứ hai). Muốn làm một cái gì đó hoàn hảo và xinh đẹp, hãy trở thành một nghệ sĩ. Được trả tiền như một, quá. Xem bình luận của tôi cho câu trả lời của Julien. – FastAl

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