/**************************************************************** ** 文件名: EventBus.cs ** 主要类: EventBus类 ** Copyright (c) 章为忠 ** 创建人: ** 日 期: 2017.3.10 ** 修改人: ** 日 期: ** 修改内容: ** 描 述: ** 版 本: ** 备 注: ****************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace Weiz.EventBus.Core { public class EventBus { /// /// 事件总线对象 /// private static EventBus _eventBus = null; /// /// 领域模型事件句柄字典,用于存储领域模型的句柄 /// private static Dictionary> _dicEventHandler = new Dictionary>(); /// /// 附加领域模型处理句柄时,锁住 /// private readonly object _syncObject = new object(); /// /// 单例事件总线 /// public static EventBus Instance { get { return _eventBus ?? (_eventBus = new EventBus()); } } /// /// 通过XML文件初始化事件总线,订阅信自在XML里配置 /// /// public static EventBus InstanceForXml() { if (_eventBus == null) { XElement root = XElement.Load(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "EventBus.xml")); foreach (var evt in root.Elements("Event")) { List handlers = new List(); Type publishEventType = Type.GetType(evt.Element("PublishEvent").Value); foreach (var subscritedEvt in evt.Elements("SubscribedEvents")) { foreach (var concreteEvt in subscritedEvt.Elements("SubscribedEvent")) { var type = Type.GetType(concreteEvt.Value); handlers.Add(System.Activator.CreateInstance(type)); } _dicEventHandler[publishEventType] = handlers; } } _eventBus = new EventBus(); } return _eventBus; } /// /// /// private readonly Func eventHandlerEquals = (o1, o2) => { var o1Type = o1.GetType(); var o2Type = o2.GetType(); return o1Type == o2Type; }; #region 订阅事件 public void Subscribe(IEventHandler eventHandler) where TEvent : IEvent { //同步锁 lock (_syncObject) { //获取领域模型的类型 var eventType = typeof(TEvent); //如果此领域类型在事件总线中已注册过 if (_dicEventHandler.ContainsKey(eventType)) { var handlers = _dicEventHandler[eventType]; if (handlers != null) { handlers.Add(eventHandler); } else { handlers = new List { eventHandler }; } } else { _dicEventHandler.Add(eventType, new List { eventHandler }); } } } /// /// 订阅事件实体 /// /// /// public void Subscribe(Action eventHandlerFunc) where TEvent : IEvent { Subscribe(new ActionDelegatedEventHandler(eventHandlerFunc)); } public void Subscribe(IEnumerable> eventHandlers) where TEvent : IEvent { foreach (var eventHandler in eventHandlers) { Subscribe(eventHandler); } } #endregion #region 发布事件 public void Publish(TEvent tEvent) where TEvent : IEvent { var eventType = typeof(TEvent); if (_dicEventHandler.ContainsKey(eventType) && _dicEventHandler[eventType] != null && _dicEventHandler[eventType].Count > 0) { var handlers = _dicEventHandler[eventType]; try { foreach (var handler in handlers) { var eventHandler = handler as IEventHandler; eventHandler.Handle(tEvent); } } catch (Exception ex) { } } else { } } public void Publish(TEvent tEvent, Action callback) where TEvent : IEvent { var eventType = typeof(TEvent); if (_dicEventHandler.ContainsKey(eventType) && _dicEventHandler[eventType] != null && _dicEventHandler[eventType].Count > 0) { var handlers = _dicEventHandler[eventType]; try { foreach (var handler in handlers) { var eventHandler = handler as IEventHandler; eventHandler.Handle(tEvent); callback(tEvent, true, null); } } catch (Exception ex) { callback(tEvent, false, ex); } } else { callback(tEvent, false, null); } } #endregion #region 取消订阅 /// /// 取消订阅事件 /// /// /// public void Unsubscribe(IEventHandler eventHandler) where TEvent : IEvent { lock (_syncObject) { var eventType = typeof(TEvent); if (_dicEventHandler.ContainsKey(eventType)) { var handlers = _dicEventHandler[eventType]; if (handlers != null && handlers.Exists(deh => eventHandlerEquals(deh, eventHandler))) { var handlerToRemove = handlers.First(deh => eventHandlerEquals(deh, eventHandler)); handlers.Remove(handlerToRemove); } } } } #endregion } }