2013-03-15 27 views
10

Tại sao chúng tôi không thể xuất bản Sự kiện mà không cần bất kỳ PayLoad nào.Xuất bản Sự kiện không có PayLoad trong Prism EventAggregator?

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(new SelectFolderEventCriteria() { }); 

Bây giờ, tôi không cần bất kỳ tải trọng nào phải trả ở đây. Nhưng việc thực hiện EventAggregator yêu cầu tôi phải có một lớp trống để làm điều đó.

sự kiện:

public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria> 
    { 
    } 

Payload:

public class SelectFolderEventCriteria 
    { 
    } 

Tại sao Prism không được đưa ra một cách để sử dụng chỉ là tổ chức sự kiện và xuất bản nó như

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(); 

là nó bằng cách thiết kế và Tôi không hiểu nó? Vui lòng giải thích. Cảm ơn!

+0

Đã trả lời giúp đỡ của tôi? – Marc

Trả lời

9

Câu hỏi hay, tôi không thấy lý do không xuất bản sự kiện mà không có trọng tải. Có những trường hợp thực tế là một sự kiện đã được nâng lên là tất cả thông tin bạn cần và muốn xử lý.

Có hai tùy chọn: Vì đây là nguồn mở, bạn có thể lấy nguồn Prism và trích xuất sự kiện CompositePresentation không tải trọng.

Tôi sẽ không làm điều đó, nhưng xử lý Prism như một thư viện của bên thứ 3 và để nó như vậy. Thực hành tốt là viết Facade để thư viện của bên thứ 3 phù hợp với dự án của bạn, trong trường hợp này là CompositePresentationEvent. Điều này có thể trông giống như sau:

public class EmptyPresentationEvent : EventBase 
{ 
    /// <summary> 
    /// Event which facade is for 
    /// </summary> 
    private readonly CompositePresentationEvent<object> _innerEvent; 

    /// <summary> 
    /// Dictionary which maps parameterless actions to wrapped 
    /// actions which take the ignored parameter 
    /// </summary> 
    private readonly Dictionary<Action, Action<object>> _subscriberActions; 

    public EmptyPresentationEvent() 
    { 
     _innerEvent = new CompositePresentationEvent<object>(); 
     _subscriberActions = new Dictionary<Action, Action<object>>(); 
    } 

    public void Publish() 
    { 
     _innerEvent.Publish(null); 
    } 

    public void Subscribe(Action action) 
    { 
     Action<object> wrappedAction = o => action(); 
     _subscriberActions.Add(action, wrappedAction); 
     _innerEvent.Subscribe(wrappedAction); 
    } 

    public void Unsubscribe(Action action) 
    { 
     if (!_subscriberActions.ContainsKey(action)) return; 
     var wrappedActionToUnsubscribe = _subscriberActions[action]; 
     _innerEvent.Unsubscribe(wrappedActionToUnsubscribe); 
     _subscriberActions.Remove(action); 
    } 
} 

Nếu có gì không rõ ràng, vui lòng hỏi.

+1

Giải pháp tuyệt vời, tôi nghĩ bạn chỉ cần thừa hưởng từ EventBase để làm cho nó hoạt động đúng cách - như được đề xuất ở đây: https://compositewpf.codeplex.com/discussions/69113 – openshac

+0

Đúng, cảm ơn bạn! Nếu bạn sử dụng nó với tiêm phụ thuộc, bạn có thể không cần thừa kế, nhưng đó không phải là câu hỏi ở đây ... – Marc

2

Chỉ cần cập nhật tình huống kể từ khi câu hỏi này được hỏi/trả lời, như của Prism 6.2, các tải trọng rỗng hiện được hỗ trợ trong Prism PubSubEvents.

Nếu bạn đang sử dụng một phiên bản cũ, blog này cho thấy làm thế nào để tạo ra một lớp "Empty" chỉ rõ mục đích của tải trọng: https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/

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