using System.Collections.Concurrent;
using GFramework.Core.Abstractions.Events;
namespace GFramework.Core.Events;
///
/// EasyEvents事件管理器类,用于全局事件的注册、获取和管理
/// 提供了类型安全的事件系统,支持泛型事件的自动创建和检索
/// 线程安全:所有公共方法都是线程安全的
///
public class EasyEvents
{
///
/// 全局单例事件管理器实例
///
private static readonly EasyEvents MGlobalEvents = new();
///
/// 存储事件类型与事件实例映射关系的字典(线程安全)
///
private readonly ConcurrentDictionary _mTypeEvents = new();
///
/// 获取指定类型的全局事件实例
///
/// 事件类型,必须实现IEasyEvent接口
/// 指定类型的事件实例,如果未注册则返回默认值
public static T Get() where T : IEvent
{
return MGlobalEvents.GetEvent();
}
///
/// 注册指定类型的全局事件
///
/// 事件类型,必须实现IEasyEvent接口且具有无参构造函数
public static void Register() where T : IEvent, new()
{
MGlobalEvents.AddEvent();
}
///
/// 获取或添加指定类型的全局事件
///
/// 事件类型,必须实现IEasyEvent接口且具有无参构造函数
/// 指定类型的事件实例
public static T GetOrAdd() where T : IEvent, new()
{
return MGlobalEvents.GetOrAddEvent();
}
///
/// 添加指定类型的事件到事件字典中
///
/// 事件类型,必须实现IEasyEvent接口且具有无参构造函数
/// 当事件类型已存在时抛出
public void AddEvent() where T : IEvent, new()
{
if (!_mTypeEvents.TryAdd(typeof(T), new T()))
{
throw new ArgumentException($"Event type {typeof(T).Name} already registered.");
}
}
///
/// 获取指定类型的事件实例
///
/// 事件类型,必须实现IEasyEvent接口
/// 指定类型的事件实例,如果不存在则返回默认值
public T GetEvent() where T : IEvent
{
return _mTypeEvents.TryGetValue(typeof(T), out var e) ? (T)e : default!;
}
///
/// 获取指定类型的事件实例,如果不存在则创建并添加到事件字典中
///
/// 事件类型,必须实现IEasyEvent接口且具有无参构造函数
/// 指定类型的事件实例
public T GetOrAddEvent() where T : IEvent, new()
{
return (T)_mTypeEvents.GetOrAdd(typeof(T), _ => new T());
}
}