Prism事件聚合器(Event/釋出訂閱)
阿新 • • 發佈:2021-08-24
什麼是Prism事件聚合器
Prism 庫提供了一種事件機制,可以實現應用程式中鬆散耦合元件之間的通訊。這種機制基於事件聚合器服務,允許釋出者和訂閱者通過事件進行通訊,並且彼此之間仍然沒有直接引用。簡單來說就是提供了一個多播發布/訂閱功能。
一圖瞭解Prism的事件聚合器,這玩意實現原理是觀察者模式,觀察者模式也就是常說的釋出/訂閱模式。
使用Prism聚合器
1、建立事件
這裡我們建立一個MessageEvent類並繼承自PubSubEvent,並傳入一個MessageModel物件泛型,也可以傳入string,int 等等基礎型別
namespace MainModule.Event { public class MessageEvent : PubSubEvent<MessageModel> { } public class MessageModel { public int Code { get; set; } public string Message { get; set; } public string Data { get; set; } } }
2、訂閱事件
通過構造注入IEventAggregator,並通過IEventAggregator的GetEvent獲取定義的訊息,再通過Subscribe方法註冊,Subscribe是一個委託方法
public MainWindow(IEventAggregator aggregator) { InitializeComponent(); _aggregator = aggregator; _aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); ; }
3、釋出事件
private readonly IEventAggregator _aggregator; //構造注入 public MainWindowViewModel(IEventAggregator aggregator) { _aggregator = aggregator; } //建立一個命令,當執行該命令時執行釋出事件的邏輯 PubSubEventCommand = new DelegateCommand(PubSubEventMessage); //釋出事件方法 private void PubSubEventMessage() { MessageModel message = new MessageModel { Code = 200, Message = "操作成功", Data = "{}" }; _aggregator.GetEvent<MessageEvent>().Publish(message); }
這樣,一個釋出/訂閱的事件就完成了,也可以在任何時候取消事件註冊,只需要呼叫Unsubscribe方法即可
_aggregator.GetEvent<MessageEvent>().Unsubscribe(ShowMethod);
由於它是多播的,你可以在任意多個地方進行釋出或訂閱。
效果圖:
過濾器
在真實業務場景中,可能需要達到某個特定要求時才進行註冊,這時候我們就可以用到Predicate<TPayload>
過濾器
_aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200);
把後面這個引數的過濾變更一下,假設Code值為500,打個斷點看一下
可以看出,不滿足過濾器的條件時,即使釋出了事件,註冊事件的委託方法也不會被觸發執行。
有興趣可以去學習下觀察者模式,此前有一篇文章也類似於這種寫法,當然肯定是沒有這個寫的出神入化,傳送門:觀察者模式的"最佳實踐"
本文的示例程式碼在該github倉庫:https://github.com/luchong0813/PrismLearning