Khi sử dụng DDD và CRQS, nên chính xác một sự kiện cho mỗi lệnh?


15

Tôi đang tìm cách để thiết kế một ứng dụng ddd với quy ước về cấu hình.

Nói một "Máy khách" tổng hợp có một lệnh được định nghĩa "FillProfile". Nó sẽ đưa ra một sự kiện "ProfileFilt" một cách hợp lý.

Có những trường hợp khi một lệnh sẽ tăng nhiều hơn một sự kiện, hoặc khi một lệnh sẽ đưa ra các sự kiện khác nhau dựa trên một số logic? Hoặc đây luôn là mối quan hệ 1 - 1 (1 lệnh sẽ luôn không đưa ra hoặc một sự kiện nào thuộc loại đã cho).

Tôi đang hỏi điều này bởi vì nếu đây là một sự thật, rằng một lệnh sẽ luôn đưa ra cùng một sự kiện, tôi có thể xây dựng hệ thống hội nghị của mình dựa trên thực tế đó. Tôi biết rằng "RaiseEvent" sẽ dẫn đến "EventRaised" ...


1
nếu lệnh gây ra 2 điều xảy ra, bạn có thể mong đợi từng điều sẽ đưa ra một sự kiện. ProfileGenerated, ProfileSatted, Ngoài ra, bất kỳ sự kiện nào cũng có thể gây ra lỗi một lần nữa có thể gây ra sự kiện
Ewan

Ngoài ra, các hệ thống cũng có thể triển khai các sự kiện BeforeCommand, AfterCommand, v.v.
Ewan

Hoặc lệnh có thể lặp, tức là hồ sơ FillProfiles () Được điền, hồ sơ Hoàn thành ....
Ewan

@Ewan, chỉ muốn sửa cho bạn. Một sự kiện tên miền không thể tạo ra một lỗi. Chỉ các lệnh có thể. Các sự kiện tên miền có nghĩa là một cái gì đó đã xảy ra , vì các lệnh có nghĩa là có ý định làm cho một cái gì đó xảy ra, có thể bị từ chối hoặc chấp nhận. Nói cách khác, một lỗi phải được đưa ra trước khi một sự kiện tên miền được gửi đi (trừ khi sự kiện tên miền đó có liên quan đến việc ghi nhật ký lỗi).
Ludovic C

Câu trả lời:


18

Vì bạn đã gắn thẻ câu hỏi của mình bằng "CQRS", tôi đoán bạn có nghĩa là các sự kiện trong ngữ cảnh "CQRS & Tìm nguồn sự kiện", giống như được mô tả ở đây . Trong hướng dẫn này , sự khác biệt giữa các sự kiện và lệnh được giải thích rõ:

  • các sự kiện nắm bắt "những điều có thể xảy ra" cơ bản trong hệ thống của bạn, theo quan điểm của hệ thống.

  • các lệnh được xác định bởi những gì người dùng coi là một hoạt động, theo quan điểm của mình

Và mặc dù điều này thường dẫn đến một vài lệnh và sự kiện có tỷ lệ tương ứng 1: 1, các quan điểm khác nhau này có thể dẫn đến các lệnh kích hoạt nhiều hơn một sự kiện hoặc các sự kiện khác nhau tùy thuộc vào các tham số lệnh. Tôi thậm chí có thể tưởng tượng các trường hợp một lệnh không đưa ra một sự kiện nào cả, nhưng đó sẽ là một trường hợp rất đặc biệt, không phải là một trường hợp rất điển hình.

Ví dụ, hướng dẫn đề cập đến các sự kiện

  • TabOpened
  • Đồ uống
  • Thực phẩm

và các lệnh

  • OpenTab
  • Địa điểm

Tại đây, lệnh "OpenTab" sẽ dẫn đến một sự kiện "TabOpened", nhưng lệnh PlaceOrder sẽ dẫn đến các sự kiện "DrinksOrdered", "FoodOrdered" hoặc cả hai.

Trên thực tế, nếu bạn đang thiết kế một hệ thống mới "từ đầu", bạn có thể thử thiết kế nó với sự tương ứng 1: 1 giữa các lệnh và sự kiện và xem tỷ lệ đó như thế nào khi hệ thống trở nên lớn hơn. Bạn thậm chí có thể thử một cách tiếp cận hỗn hợp: một danh sách các sự kiện và lệnh với sự tương ứng 1: 1, cùng với một số lệnh kết hợp bổ sung. Chỉ cần thử bao xa dẫn bạn đến hệ thống cụ thể mà bạn đang thiết kế.


9

Thông thường một lệnh sẽ dẫn đến một sự kiện. Nhưng trong một số trường hợp nó cũng có thể nhiều hơn một, nó phụ thuộc vào việc thực hiện của bạn.

Hoặc lệnh của bạn gọi các lệnh khác và mỗi lệnh sẽ kích hoạt các sự kiện riêng. Hoặc lệnh của bạn thực hiện các nhiệm vụ khác nhau và tự phát hành nhiều sự kiện. Ví dụ:

Đăng kýUserCommand

  • User.create (email, mật khẩu) → UserCreatedEvent
  • User.updateProfile (FirstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultgroup () → UserJoinedgroupEvent

Điều gì xảy ra nếu sau này bạn quyết định có UserWasAddedToCrm? Viết lại toàn bộ luồng của bạn?
mcintyre321

9

Một lệnh có thể nâng cao nhiều sự kiện. Nó chỉ đơn giản là kết luận hợp lý của một thực tế: Composite commandtồn tại.

Hãy nói rằng bạn có hai lệnh, mỗi lệnh đưa ra một sự kiện. Sau đó, bạn tạo một lệnh tổng hợp của hai. Từ quan điểm của một người sử dụng lệnh tổng hợp, có vẻ như lệnh đã đưa ra hai sự kiện.

Vì vậy, không có gì ngăn bạn có một lệnh tăng nhiều sự kiện (hoặc thậm chí không có).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.