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);

由於它是多播的,你可以在任意多個地方進行發布或訂閱。

效果圖:

4

過濾器

在真實業務場景中,可能需要達到某個特定要求時才進行注冊,這時候我們就可以用到Predicate<TPayload>過濾器

image-20210823221608468

 _aggregator.GetEvent<MessageEvent>().Subscribe(ShowMethod, arg => arg.Code == 200); 

把后面這個參數的過濾變更一下,假設Code值為500,打個斷點看一下

3

可以看出,不滿足過濾器的條件時,即使發布了事件,注冊事件的委托方法也不會被觸發執行。

有興趣可以去學習下觀察者模式,此前有一篇文章也類似於這種寫法,當然肯定是沒有這個寫的出神入化,傳送門:觀察者模式的"最佳實踐"

本文的示例代碼在該github倉庫:https://github.com/luchong0813/PrismLearning


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM