2011-07-13 41 views
9

Tôi hiểu sự khác biệt giữa các lệnh và sự kiện nhưng trong nhiều trường hợp bạn kết thúc với dự phòng và ánh xạ giữa 2 lớp về cơ bản giống nhau (ThingNameUpdateCommand, ThingNameUpdatedEvent). Đối với những trường hợp đơn giản, bạn có thể/bạn sử dụng sự kiện cũng như một lệnh? Mọi người có tuần tự hóa để lưu trữ tất cả các lệnh cũng như tất cả các sự kiện không? Có vẻ như hơi dư thừa với tôi.Lệnh Sourcing Sự kiện vs Sự kiện

Trả lời

12

Tất cả rất nhiều dư thừa này là vì một lý do nói chung và bạn muốn tránh sử dụng cùng một thông điệp cho hai mục đích khác nhau đối với một số lý do:

  1. sự kiện Có nguồn gốc phải được phiên bản khi họ thay đổi kể từ khi họ được lưu trữ và tái sử dụng (deserialized) khi bạn hydrate một gốc tổng hợp. Nó sẽ làm cho mọi thứ trở nên hơi khó xử nếu lớp đó cũng đang được sử dụng như một thông điệp.
  2. Khớp nối được tăng lên, cùng một lớp hiện đang được sử dụng bởi trình xử lý lệnh, mô hình miền và trình xử lý sự kiện ngay bây giờ. De-khớp nối bên lệnh từ sự kiện này có thể đơn giản hóa cuộc sống cho bạn xuống đường.
  3. Cuối cùng là rõ ràng. Lệnh được phát hành bằng một ngôn ngữ yêu cầu một cái gì đó phải được thực hiện (bắt buộc nói chung). Sự kiện là đại diện cho những gì đã xảy ra (quá khứ thường). Ngôn ngữ này bị lộn xộn nếu bạn sử dụng cùng một lớp cho cả hai.

Cuối cùng, đây chỉ là các lớp dữ liệu, không phải là mã này "cứng". Có nhiều cách để thực sự tránh một số cách gõ cho các kịch bản đơn giản như mã-gen. Ví dụ, tôi biết Greg đã sử dụng các biến đổi XML và XSD để tạo tất cả các lớp cần thiết cho một miền cụ thể trong quá khứ.

Tôi muốn nói rất nhiều trường hợp đơn giản bạn có thể muốn đặt câu hỏi nếu đây thực sự là miền (tức là hành vi lập mô hình) hay chỉ là dữ liệu. Nếu nó chỉ là dữ liệu xem xét không sử dụng nguồn sự kiện ở đây. Dưới đây là một cuộc nói chuyện tương tự Udi Dahan đã nói về việc phá vỡ mô hình miền của bạn để không phải tất cả đều đòi hỏi sự kiện tìm nguồn cung ứng. Tôi là loại phù hợp với cách suy nghĩ này bây giờ bản thân mình.

http://skillsmatter.com/podcast/design-architecture/talk-from-udi-dahan

1

Sau khi làm việc thông qua một số ví dụ và đặc biệt là trình bày Greg Young (http://www.youtube.com/watch?v=JHGkaShoyNs) Tôi đã đi đến kết luận rằng lệnh là không cần thiết. Họ chỉ đơn giản là sự kiện từ người dùng của bạn, họ đã nhấn nút đó. Bạn nên lưu trữ chúng một cách chính xác giống như các sự kiện khác vì đó là dữ liệu bạn không biết nếu bạn muốn sử dụng nó trong một khung nhìn trong tương lai. Người dùng của bạn đã thêm và sau đó xóa mục đó khỏi rổ hoặc ít nhất là cố gắng. Sau này, bạn có thể muốn sử dụng thông tin này để nhắc người dùng về điều này vào ngày sau đó.

+0

Tôi cũng đang theo hướng này. Tôi đọc một số điểm tốt về việc bạn muốn sự kiện của bạn chứa tất cả dữ liệu cần thiết để làm công việc, đặc biệt khi dữ liệu đó có thể đến từ các hệ thống bên ngoài không có biểu diễn lịch sử. Nhưng bạn chỉ có thể áp dụng thực hành tốt đó cho Lệnh. Đặc biệt là tôi nghĩ nếu bạn muốn làm một cái gì đó rất DDD, không nên có sự khác biệt thực sự giữa các lệnh hoặc sự kiện. Mục đích phải rõ ràng và dữ liệu lịch sử bên ngoài miền của bạn nên được bao gồm. – Arwin

+0

Tôi vẫn cho rằng các lệnh là thừa. Tôi chỉ gọi những gì tôi làm chức năng tìm nguồn cung ứng sự kiện. Một blog gần đây của tôi với ES và F # Elm là một hệ thống hoàn chỉnh: http://anthonylloyd.github.io/blog/2016/11/27/event-sourcing – Ant

+0

Tôi cũng nghĩ rằng sự khác biệt đối với tôi là sử dụng FP thay vì OO . ES ánh xạ tới FP thực sự tốt với các loại tổng hợp là một lược đồ sự kiện có thể mở rộng tự nhiên. Tính bất biến cũng phù hợp thực sự tốt với ES. – Ant

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