1. 程式人生 > 其它 >Prism事件聚合器(Event/釋出訂閱)

Prism事件聚合器(Event/釋出訂閱)

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