// 在此输入C#代码 /// <summary> /// 消息发布管理 /// </summary> internal class CFMessagePublisher : ICFMessagePublisher { private Dictionary<Type, List<CFMessageSubscriber>> subscribers = new Dictionary<Type, List<CFMessageSubscriber>>(); private object subscribersLocker = new object(); /// <summary> /// 订阅同步消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="domainEventSubscriber">消息响应</param> public void Subscribe<T>(Action<T> domainEventSubscriber) { this.Subscribe(new CFMessageSubscriber { EventType = typeof(T), EventHandler = domainEventSubscriber, IsAsnyc = false, }); } /// <summary> /// 订阅异步消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="domainEventSubscriber">消息响应</param> public void SubscribeAsync<T>(Action<T> domainEventSubscriber) { this.Subscribe(new CFMessageSubscriber { EventType = typeof(T), EventHandler = domainEventSubscriber, IsAsnyc = true, }); } /// <summary> /// 订阅消息 /// </summary> /// <param name="domainEventSubscriber">消息响应</param> private void Subscribe(CFMessageSubscriber domainEventSubscriber) { if (!this.subscribers.ContainsKey(domainEventSubscriber.EventType)) { lock (this.subscribersLocker) { if (!this.subscribers.ContainsKey(domainEventSubscriber.EventType)) this.subscribers.Add(domainEventSubscriber.EventType, new List<CFMessageSubscriber>()); } } this.subscribers[domainEventSubscriber.EventType].Add(domainEventSubscriber); }
/// <summary> /// 发布消息 /// </summary> /// <typeparam name="T">消息类型</typeparam> /// <param name="domainEvent">消息体</param> public void Publish<T>(T domainEvent) { List<CFMessageSubscriber> subscriber = null; this.subscribers.TryGetValue(typeof(T), out subscriber); if (subscriber != null) { subscriber.ForEach(d => { Action<T> action = (Action<T>)d.EventHandler; if (d.IsAsnyc) action.BeginInvoke(domainEvent, ar => { try { action.EndInvoke(ar); } catch { } }, null); else action.Invoke(domainEvent); }); } }
/// <summary> /// 重置消息订阅队列 /// </summary> public void Reset() { this.subscribers.Clear(); } /// <summary> /// 重置指定类型的消息订阅队列 /// </summary> /// <typeparam name="T">消息类型</typeparam> public void Reset<T>() { Type type = typeof(T); if (this.subscribers.ContainsKey(type)) this.subscribers.Remove(type); }
}
|