首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

插件式框架探索:基於委派的訂閱發布機制(Messenger 模式)

     編輯:關於.NET

前言

傳統事件機制會產生類別間的強耦合。Messenger 模式(又稱事件匯流排)引入中介者,實現「發布者零感知訂閱者、訂閱者零感知發布者」的鬆耦合通訊。本文設計一套支援弱引用、多型別、一次性訂閱的 Messenger 體系,並延伸出資料驅動的訂閱/發布適配器。

核心架構:Messenger 抽象基類

  • 內部儲存結構:Dictionary<T, List<WeakAction>>,Key 為訊息語義型別,Value 為弱引用動作列表。
  • WeakAction:封裝 WeakReference,避免 Messenger 持有訂閱者強引用導致記憶體洩漏。
  • 核心方法:Subscribe<T>(Action<T>)、Unsubscribe<T>(Action<T>)、Notify<T>(T message)、NotifyAsync<T>(T message)。

三種具體 Messenger 實作

類型特點適用場景
GeneralMessenger繼承 Messenger<object>,通用無型別限制大多數鬆耦合通訊場景
TypeMessenger泛型 Messenger<TMessage>,按訊息型別分發訊息驅動架構、分散式系統指令分發
OnceOffMessenger訂閱一次即自動移除一次性通知、對話框確認等臨時行為

所有 Messenger 均可透過 SingletonManager.GetInstance<T>() 取得單例實例。

資料訂閱/發布適配器模式

參考 Apache MINA 過濾器鏈概念,定義雙重角色介面:

  • IPublisher<T>:OnMessage(T)、OnMessageAsync(T) 發布資料。
  • ISubscriber<T>:Subscribe() 註冊處理邏輯,Handle(T) 處理資料。

標準實作 PublisherAdapter、SubscriberAdapter<T> 均內建 TypeMessenger:

// 訂閱者註冊處理邏輯
public void Subscribe()
{
    messenger.Subscribe<T>(msg => Handle(msg));
}

// 發布者分發資料
public virtual void OnMessage(object message)
{
    if (message != null) messenger.NotifyAll(message);
}

public virtual void OnMessageAsync(object message)
{
    if (message != null) messenger.NotifyAllAsync(message);
}

防死循環機制:SubscriberAdapter 發布資料時,若型別與自身訂閱型別相同,會被攔截拋棄,避免無限遞迴。

優勢總結

  • 零耦合:發布/訂閱雙方無直接引用。
  • 記憶體安全:弱引用機制自動清理失效訂閱。
  • 彈性擴充:支援同步/非同步、型別/無型別、一次性/持久多種模式。
  • 管線化處理:資料可在多個訂閱者間流轉、轉換、豐富。

結語

Messenger 模式以「中介者+弱引用+型別語義」取代傳統事件,極大降低元件間耦合,適合插件架構、模組化系統、分散式訊息處理。配合單例管理與適配器模式,可構建類似 MINA 過濾器鏈的資料處理管線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved