什么是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