好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

从Prism中学习设计模式之Event Aggregator 模式

从Prism中学习设计模式之Event Aggregator 模式

从Prism中学习设计模式之Event Aggregator 模式

Event Aggregator 模式定义:渠道事件从多个对象通过一个单一的对象来简化clients的注册。

结构图:

Prism的Event Aggregator 模式:Event Aggregator允许多对象定位和发布、订阅事件。

我们从Prism源代码中德EventAggregator和CompositePresentationEvent可以学习它是如何管理和传递事件消息的。

   1       public   interface   IEventAggregator
    2       {
    3          TEventType GetEvent<TEventType>()  where  TEventType : EventBase,  new  ();
    4       }
    5  
   6       public   class   EventAggregator : IEventAggregator
    7       {
    8           private   readonly  Dictionary<Type, EventBase> events =  new  Dictionary<Type, EventBase> ();
    9  
  10           public  TEventType GetEvent<TEventType>()  where  TEventType : EventBase,  new  ()
   11           {
   12              EventBase existingEvent =  null  ;
   13  
  14               if  (! this .events.TryGetValue( typeof (TEventType),  out   existingEvent))
   15               {
   16                  TEventType newEvent =  new   TEventType();
   17                   this .events[ typeof (TEventType)] =  newEvent;
   18  
  19                   return   newEvent;
   20               }
   21               else 
  22               {
   23                   return   (TEventType)existingEvent;
   24               }
   25           }
   26       }
   27  
  28     public   class  CompositePresentationEvent<TPayload>  : EventBase
   29       {
   30           private   IDispatcherFacade uiDispatcher;
   31  
  32           private   IDispatcherFacade UIDispatcher
   33           {
   34               get 
  35               {
   36                   if  (uiDispatcher ==  null  )
   37                   {
   38                       this .uiDispatcher =  new   DefaultDispatcher();
   39                   }
   40  
  41                   return   uiDispatcher;
   42               }
   43           }
   44  
  45           public  SubscriptionToken Subscribe(Action<TPayload>  action)
   46           {
   47               return   Subscribe(action, ThreadOption.PublisherThread);
   48           }
   49  
  50           public  SubscriptionToken Subscribe(Action<TPayload>  action, ThreadOption threadOption)
   51           {
   52               return  Subscribe(action, threadOption,  false  );
   53           }
   54  
  55           public  SubscriptionToken Subscribe(Action<TPayload> action,  bool   keepSubscriberReferenceAlive)
   56           {
   57               return   Subscribe(action, ThreadOption.PublisherThread, keepSubscriberReferenceAlive);
   58           }
   59  
  60           public  SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption,  bool   keepSubscriberReferenceAlive)
   61           {
   62               return  Subscribe(action, threadOption, keepSubscriberReferenceAlive,  null  );
   63           }
   64  
  65           public   virtual  SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption,  bool  keepSubscriberReferenceAlive, Predicate<TPayload>  filter)
   66           {
   67              IDelegateReference actionReference =  new   DelegateReference(action, keepSubscriberReferenceAlive);
   68               IDelegateReference filterReference;
   69               if  (filter !=  null  )
   70               {
   71                  filterReference =  new   DelegateReference(filter, keepSubscriberReferenceAlive);
   72               }
   73               else 
  74               {
   75                  filterReference =  new  DelegateReference( new  Predicate<TPayload>( delegate  {  return   true ; }),  true  );
   76               }
   77              EventSubscription<TPayload>  subscription;
   78               switch   (threadOption)
   79               {
   80                   case   ThreadOption.PublisherThread:
   81                      subscription =  new  EventSubscription<TPayload> (actionReference, filterReference);
   82                       break  ;
   83                   case   ThreadOption.BackgroundThread:
   84                      subscription =  new  BackgroundEventSubscription<TPayload> (actionReference, filterReference);
   85                       break  ;
   86                   case   ThreadOption.UIThread:
   87                      subscription =  new  DispatcherEventSubscription<TPayload> (actionReference, filterReference, UIDispatcher);
   88                       break  ;
   89                   default  :
   90                      subscription =  new  EventSubscription<TPayload> (actionReference, filterReference);
   91                       break  ;
   92               }
   93  
  94  
  95               return   base  .InternalSubscribe(subscription);
   96           }
   97  
  98           public   virtual   void   Publish(TPayload payload)
   99           {
  100               base  .InternalPublish(payload);
  101           }
  102  
 103           public   virtual   void  Unsubscribe(Action<TPayload>  subscriber)
  104           {
  105               lock   (Subscriptions)
  106               {
  107                  IEventSubscription eventSubscription = Subscriptions.Cast<EventSubscription<TPayload>>().FirstOrDefault(evt => evt.Action ==  subscriber);
  108                   if  (eventSubscription !=  null  )
  109                   {
  110                       Subscriptions.Remove(eventSubscription);
  111                   }
  112               }
  113           }
  114  
 115           public   virtual   bool  Contains(Action<TPayload>  subscriber)
  116           {
  117               IEventSubscription eventSubscription;
  118               lock   (Subscriptions)
  119               {
  120                  eventSubscription = Subscriptions.Cast<EventSubscription<TPayload>>().FirstOrDefault(evt => evt.Action ==  subscriber);
  121               }
  122               return  eventSubscription !=  null  ;
  123           }
  124  
 125      }

订阅 取消订阅 发布 比较定位

简单用法:

  1   public   class   Model{
   2       private   readonly   IEventAggregator eventAggregator;
   3  
  4       this .eventAggregator =  eventAggregator;
   5       this .eventAggregator.GetEvent<UpdatedEvent>().Subscribe( this  .Updated, ThreadOption.UIThread);
   6  
  7           private   void   Updated()
   8           {
   9               //  Todo Something 
 10           }
  11  
 12   }
  13  
 14       public   class  UpdatedEvent: CompositePresentationEvent<IDictionary< string ,  decimal >>
 15       {
  16      }            

 参考资料:

http://HdhCmsTestmartinfowler测试数据/eaaDev/EventAggregator.html

 

 

分类:  .Net

标签:  C# ,  WPF ,  Prism

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于从Prism中学习设计模式之Event Aggregator 模式的详细内容...

  阅读:38次