2009-02-17 41 views
10

Tôi đã tìm kiếm trong các Composite Application Library, và nó là tuyệt vời, nhưng tôi đang gặp khó khăn khi quyết định khi nào nên sử dụng EventAggregator ... hay đúng hơn - khi KHÔNG sử dụng nó.CompositeWPF: EventAggregator - khi nào nên sử dụng?

Nhìn vào ví dụ StockTraderRI, tôi thậm chí còn bối rối hơn. Họ đang sử dụng EventAggregator trong một số trường hợp và các sự kiện "cổ điển" trong các trường hợp khác (ví dụ như giao diện IAccountPositionService).

Tôi đã quyết định sử dụng nó để giao tiếp với một tác vụ nặng nề, sẽ chạy trên một chuỗi nền. Trong trường hợp này EventAggregator cung cấp sự sắp xếp lại các luồng đằng sau hậu trường, vì vậy tôi không phải lo lắng nhiều về điều đó. Bên cạnh đó tôi thích cách tách này cung cấp.

Vì vậy, câu hỏi của tôi là: Khi tôi bắt đầu sử dụng EventAggregator trong ứng dụng của mình, tại sao không sử dụng nó cho tất cả sự kiện tùy chỉnh?

Trả lời

20

Đây là một câu hỏi hay. Trong Composite WPF (Prism) có 3 cách có thể để giao tiếp giữa các phần của ứng dụng của bạn. Một cách là sử dụng Lệnh, chỉ được sử dụng để chuyển các hành động do UI kích hoạt xuống đường tới mã thực tế thực hiện hành động đó. Một cách khác là sử dụng Dịch vụ được chia sẻ, trong đó nhiều phần chứa tham chiếu đến cùng một Dịch vụ (Singleton) và chúng xử lý các sự kiện khác nhau trên dịch vụ đó theo cách cổ điển. Đối với giao tiếp bị ngắt kết nối và không đồng bộ, như bạn đã nói, cách tốt nhất là sử dụng Event Aggregator (theo sau mẫu của Martin Fowler).

Bây giờ, khi đến và không sử dụng nó:

  1. Sử dụng nó khi bạn cần để giao tiếp giữa các module. (ví dụ, một mô-đun nhiệm vụ cần được thông báo khi một nhiệm vụ được tạo ra bởi bất kỳ mô-đun nào khác).
  2. Sử dụng nó khi bạn có nhiều người nhận hoặc nguồn của cùng một sự kiện. Ví dụ, bạn có một danh sách các đối tượng và bạn muốn làm mới nó bất cứ khi nào một đối tượng thuộc loại đó được lưu hoặc tạo ra. Thay vì giữ tham chiếu đến tất cả các màn hình chỉnh sửa/tạo mở, bạn chỉ cần đăng ký sự kiện cụ thể này.
  3. Không sử dụng nó khi bạn chỉ phải đăng ký các sự kiện bình thường trong khu vực Trình xem mô hình. Ví dụ, nếu người trình bày của bạn lắng nghe những thay đổi trong Model (ví dụ Model thực hiện INotifyPropertyChanged) và Presenter của bạn cần phản ứng với những thay đổi đó, tốt hơn là Presenter của bạn xử lý trực tiếp sự kiện PropertyChanged của Model thay vì chuyển hướng các sự kiện đó thông qua Event Aggregator. Vì vậy, nếu cả người gửi và người nhận đều ở cùng một đơn vị, không cần phải "phát" các sự kiện như vậy cho toàn bộ ứng dụng.

Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn.

+0

# 3 chắc chắn là nơi tôi nghi ngờ nhất, nhưng tôi có thể thấy lý lẽ không phát sóng sự kiện cho toàn bộ ứng dụng có ý nghĩa. Cảm ơn câu trả lời của bạn :-) – toxvaerd

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