輕量級MVVM框架Stylet介紹:(8)事件聚合器


EventAggregator 是一個分散的、弱綁定的、基於發布/訂閱的事件管理器。

發布者和訂閱者

訂閱者

對特定事件感興趣的訂閱者可以告訴 IEventAggregator 他們的興趣,並且每當發布者將該特定事件發布到 IEventAggregator 時,都會收到通知。

事件是類 - 用它們做任何你想做的事情。例如:

class MyEvent { 
 
  // Do something 
 
}

訂閱者必須實現IHandle ,這是T就是希望接收到的事件的類型(當然也可以實現多個IHandle ).然后必須獲取一個IEventAggregator類型的實例,並且訂閱自己,比如:

class Subscriber : IHandle<MyEvent>, IHandle<MyOtherEvent>
{
   public Subscriber(IEventAggregator eventAggregator)
   {
      eventAggregator.Subscribe(this);
   }
 
   public void Handle(MyEvent message)
   {
      // ...
   }
 
   public void Handle(MyOtherEvent message)
   {
      // ...
   }
}

發布者

發布者必須也能獲取IEventAggregator的實例,但是不必訂閱自己-只需要在每次發布事件時調用IEventAggregator.Publish即可。

class Publisher
{
   private IEventAggregator eventAggregator;
   public Publisher(IEventAggregator eventAggregator)
   {
      this.eventAggregator = eventAggregator;
   }
 
   public void PublishEvent()
   {
      this.eventAggregator.Publish(new MyEvent());
   }
}

取消訂閱和弱綁定

由於IEvnetAggregator是一種弱綁定,並不需要顯示取消訂閱。如果需要也可以取消:

IEventAggregator.Unsubscribe(this);

同步和異步發布

默認IEventAggregator.Publish方法是同步發布事件的,也可以調用PublishOnUIThread調度異步發布到UI線程,或者調用PublishWithDispatcher進行異步調度。

通道

訂閱者可以監聽特定的通道,發布者也可以發布事件到特定的通道。如果一個事件發布到特定的通道里,只有訂閱了該通道的訂閱者才能收到該事件。這在同一信息在多個不同的Context使用時特別有用。

通道是一個字符串,允許訂閱者與通道,發布者與通道的松耦合。

默認情況下,Subscribe()方法將訂閱單一通道的事件,EventAggregator.DefaultChannel。類似的Publish()也是發布事件到的通道。當然可以指定自己的通道。

訂閱到通道

想要訂閱到特定的通道,給Subscribe方法傳參:eventAggregator.Subscribe(this, "ChannelA")。也可以訂閱多個通道:eventAggregator.Subscribe(this, "ChannelA", "ChannelB")。指定通道的情況下,默認通道將不起作用。

發布到通道

與訂閱到通道類似,不再贅述。

取消通道中的訂閱

eventAggregator.Unsubscribe(this, "ChannelA")表示取消訂閱channelA通道的事件,eventAggregator.Unsubscribe(this)表示取消所有通道的事件。

使用自己的IoC容器

如果使用默認的Bootstrapper ,即StyletIoC,EventAggregator 已經默認配置;

但是,如果您使用的是其他 IoC 容器,則需要確保 EventAggregator 已注冊為IEventAggregator接口的單例服務 - 必須只創建一個 EventAggregator 實例,並且每次請求時都必須返回此一次實例。


免責聲明!

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



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