MVVMLight消息通知實現機制詳解(一)

  最近對委託、事件的訂閱使用的太多,訂閱與被訂閱之間的綁定約束很是...麻煩,因此翻了下MVVMLight源碼找出這段能夠拿出來用的部分,詳情見下:html

  一.開發中遇到的問題:框架

  場景1:ClassA中存在事件OnDataChanged,在數據發生改變時調用OnDataChanged事件通知其訂閱者ClassB作相應處理工具

  1. 實現過程通常分以下幾種
  • ClassB中有ClassA的實例,而後訂閱事件
  • ClassA是單例模式,能夠直接在ClassB中訂閱單例ClassA的實例事件
  • ClassA、ClassB的實例在一個共同的對象中,ClassB訂閱ClassA的實例事件

   問題:發生訂閱這件事兒永遠都須要前提條件,訂閱方與被訂閱方必須直接接觸到才能夠實現該邏輯,這樣在不須要訂閱與被訂閱的對象接觸時就很差處理邏輯了post

 

  場景2:A、B兩我的合做,分別寫訂閱方邏輯、被訂閱方邏輯this

  實現過程當中,會遇到以下問題:url

  • B須要依賴A必須先寫好訂閱事件才能夠開始本身的工做
  • 在A、B雙方對事件的參數、命名等發生修改時必須及時通知對方並要求對方當即更正,不然沒法實現編譯、調試和運行

  

  二.MVVMLight中消息通知機制的對外實現spa

  • 框架下對全部對象提供單例Messenger工具類,任何須要訂閱、被訂閱(發送、接收事件消息)的對象都經過對Messenger進行調用實現
  • 避免了訂閱方與被訂閱方必須實例接觸的問題了
  • 調用方式上,在發送和接收用以下參數定義方式實現

/// <summary>
/// 註冊訂閱事件
/// </summary>
/// <typeparam name="TMessage">傳參類型</typeparam>
/// <param name="recipient">訂閱實例</param>
/// <param name="token">發送與接收定義的key值</param>
/// <param name="action">訂閱事件觸發的action</param>
/// <param name="keepTargetAlive">持續控制實例存在,防止被回收清除</param>
public virtual void Register<TMessage>(object recipient,object token,Action<TMessage> action,bool keepTargetAlive = false)調試

/// <summary>
/// 被訂閱方觸發事件
/// </summary>
/// <typeparam name="TMessage">傳參類型</typeparam>
/// <param name="message">參數數據</param>
/// <param name="token">key</param>
public virtual void Send<TMessage>(TMessage message, object token)code

  例htm

public class Class1
    {
        public Class1()
        {
            MessageTool.Messenger.Default.Register<string>(this, "key", DataChangedHandle);
        }

        //訂閱觸發事件
        public void DataChangedHandle(string obj)
        {
            //dosomething
        }

        /// <summary>
        ///對外通知事件消息
        /// </summary>
        public void SendMessage() {
            MessageTool.Messenger.Default.Send("Message", "key");
        }
    }

   邏輯解釋:

  • 訂閱時傳參的「Key」是發送與接收之間惟一的key值,它的類型是object類型,也就是說能夠根據自身需求進行設置key值類型
  • Messenger其內部邏輯是在對Key值和傳參類型進行比對,徹底符合時纔會調用訂閱方實例的action
  • Messenger有多重重載,訂閱時不設置key,對任何傳參類型相同的調用都接收觸發,詳情找機會下次分享

 

  優勢:避免訂閱與被訂閱的實例接觸、事件參數命名發生改變時影響變小,最多觸發不到,不會影響編譯

   缺點:我看到的必須有傳參,即便null也能夠,但必須有

  

  下一節對這段源碼拿出來看下什麼狀況,挖坑待填

  

   接上文:

MVVMLight消息通知實現機制詳解(二)

相關文章
相關標籤/搜索