using System.Collections.Concurrent; using GFramework.Core.Abstractions.Events; namespace GFramework.Core.Events; /// /// 增强的事件总线,支持统计和过滤器 /// 线程安全:使用 ConcurrentDictionary 存储事件 /// public sealed class EnhancedEventBus : IEventBus { private readonly EasyEvents _mEvents = new(); private readonly ConcurrentDictionary _mFilterableEvents = new(); private readonly EasyEvents _mPriorityEvents = new(); private readonly ConcurrentDictionary _mWeakEvents = new(); private readonly EventStatistics? _statistics; /// /// 构造函数 /// /// 是否启用统计功能 public EnhancedEventBus(bool enableStatistics = false) { _statistics = enableStatistics ? new EventStatistics() : null; } /// /// 获取事件统计信息(如果启用) /// public IEventStatistics? Statistics => _statistics; #region IEventBus Implementation /// /// 发送指定类型的事件实例(自动创建默认实例) /// /// 事件类型 public void Send() where T : new() { _statistics?.RecordPublish(typeof(T).Name); _mEvents .GetOrAddEvent>() .Trigger(new T()); } /// /// 发送指定类型的事件实例 /// /// 事件类型 /// 事件实例 public void Send(T e) { _statistics?.RecordPublish(typeof(T).Name); _mEvents .GetOrAddEvent>() .Trigger(e); } /// /// 发送具有指定传播方式的优先级事件 /// /// 事件类型 /// 事件实例 /// 事件传播方式 public void Send(T e, EventPropagation propagation) { _statistics?.RecordPublish(typeof(T).Name); _mPriorityEvents .GetOrAddEvent>() .Trigger(e, propagation); } /// /// 注册事件监听器 /// /// 事件类型 /// 事件处理回调 /// 反注册接口,用于取消订阅 public IUnRegister Register(Action onEvent) { if (_statistics != null) { // 包装回调以添加统计 Action wrappedHandler = data => { try { onEvent(data); _statistics.RecordHandle(); } catch { _statistics.RecordFailure(); throw; } }; var unregister = _mEvents.GetOrAddEvent>().Register(wrappedHandler); UpdateEventListenerCount(); return new DefaultUnRegister(() => { unregister.UnRegister(); UpdateEventListenerCount(); }); } return _mEvents.GetOrAddEvent>().Register(onEvent); } /// /// 注册具有优先级的监听器 /// /// 事件类型 /// 事件处理回调 /// 优先级,数值越大优先级越高 /// 反注册接口,用于取消订阅 public IUnRegister Register(Action onEvent, int priority) { if (_statistics != null) { // 包装回调以添加统计 Action wrappedHandler = data => { try { onEvent(data); _statistics.RecordHandle(); } catch { _statistics.RecordFailure(); throw; } }; var unregister = _mPriorityEvents.GetOrAddEvent>().Register(wrappedHandler, priority); UpdatePriorityEventListenerCount(); return new DefaultUnRegister(() => { unregister.UnRegister(); UpdatePriorityEventListenerCount(); }); } return _mPriorityEvents.GetOrAddEvent>().Register(onEvent, priority); } /// /// 注销事件监听器 /// /// 事件类型 /// 事件处理回调 public void UnRegister(Action onEvent) { _mEvents.GetEvent>().UnRegister(onEvent); UpdateEventListenerCount(); } /// /// 注册带有上下文信息的优先级事件监听器 /// /// 事件类型 /// 事件处理回调,接收事件上下文 /// 反注册接口,用于取消订阅 public IUnRegister RegisterWithContext(Action> onEvent) { if (_statistics != null) { // 包装回调以添加统计 Action> wrappedHandler = context => { try { onEvent(context); _statistics.RecordHandle(); } catch { _statistics.RecordFailure(); throw; } }; var unregister = _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(wrappedHandler); UpdatePriorityEventListenerCount(); return new DefaultUnRegister(() => { unregister.UnRegister(); UpdatePriorityEventListenerCount(); }); } return _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(onEvent); } /// /// 注册带有上下文信息和优先级的监听器 /// /// 事件类型 /// 事件处理回调,接收事件上下文 /// 优先级,数值越大优先级越高 /// 反注册接口,用于取消订阅 public IUnRegister RegisterWithContext(Action> onEvent, int priority) { if (_statistics != null) { // 包装回调以添加统计 Action> wrappedHandler = context => { try { onEvent(context); _statistics.RecordHandle(); } catch { _statistics.RecordFailure(); throw; } }; var unregister = _mPriorityEvents.GetOrAddEvent>() .RegisterWithContext(wrappedHandler, priority); UpdatePriorityEventListenerCount(); return new DefaultUnRegister(() => { unregister.UnRegister(); UpdatePriorityEventListenerCount(); }); } return _mPriorityEvents.GetOrAddEvent>().RegisterWithContext(onEvent, priority); } #endregion #region Filterable Events /// /// 发送支持过滤的事件 /// /// 事件类型 /// 事件实例 public void SendFilterable(T e) { var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd( typeof(T), _ => new FilterableEvent(_statistics)); evt.Trigger(e); } /// /// 注册支持过滤的事件监听器 /// /// 事件类型 /// 事件处理回调 /// 反注册接口 public IUnRegister RegisterFilterable(Action onEvent) { var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd( typeof(T), _ => new FilterableEvent(_statistics)); return evt.Register(onEvent); } /// /// 为指定事件类型添加过滤器 /// /// 事件类型 /// 过滤器 public void AddFilter(IEventFilter filter) { var evt = (FilterableEvent)_mFilterableEvents.GetOrAdd( typeof(T), _ => new FilterableEvent(_statistics)); evt.AddFilter(filter); } /// /// 移除指定事件类型的过滤器 /// /// 事件类型 /// 过滤器 public void RemoveFilter(IEventFilter filter) { if (_mFilterableEvents.TryGetValue(typeof(T), out var obj)) { var evt = (FilterableEvent)obj; evt.RemoveFilter(filter); } } /// /// 清除指定事件类型的所有过滤器 /// /// 事件类型 public void ClearFilters() { if (_mFilterableEvents.TryGetValue(typeof(T), out var obj)) { var evt = (FilterableEvent)obj; evt.ClearFilters(); } } #endregion #region Weak Events /// /// 发送弱引用事件 /// /// 事件类型 /// 事件实例 public void SendWeak(T e) { var evt = (WeakEvent)_mWeakEvents.GetOrAdd( typeof(T), _ => new WeakEvent(_statistics)); evt.Trigger(e); } /// /// 注册弱引用事件监听器 /// /// 事件类型 /// 事件处理回调 /// 反注册接口 public IUnRegister RegisterWeak(Action onEvent) { var evt = (WeakEvent)_mWeakEvents.GetOrAdd( typeof(T), _ => new WeakEvent(_statistics)); return evt.Register(onEvent); } /// /// 清理指定事件类型的已回收弱引用 /// /// 事件类型 public void CleanupWeak() { if (_mWeakEvents.TryGetValue(typeof(T), out var obj)) { var evt = (WeakEvent)obj; evt.Cleanup(); } } #endregion #region Helper Methods /// /// 更新普通事件的监听器数量统计 /// private void UpdateEventListenerCount() { if (_statistics == null) return; var evt = _mEvents.GetEvent>(); if (evt != null) { var count = evt.GetListenerCount(); _statistics.UpdateListenerCount(typeof(T).Name, count); } } /// /// 更新优先级事件的监听器数量统计 /// private void UpdatePriorityEventListenerCount() { if (_statistics == null) return; var evt = _mPriorityEvents.GetEvent>(); if (evt != null) { var count = evt.GetListenerCount(); _statistics.UpdateListenerCount(typeof(T).Name, count); } } #endregion }