using System.Collections.Concurrent; using GFramework.Core.Abstractions.architecture; namespace GFramework.Core.architecture; /// /// 游戏上下文管理类,用于管理当前的架构上下文实例 /// public static class GameContext { private static readonly ConcurrentDictionary ArchitectureDictionary = new(); /// /// 获取所有已注册的架构上下文的只读字典 /// public static IReadOnlyDictionary ArchitectureReadOnlyDictionary => ArchitectureDictionary; /// /// 绑定指定类型的架构上下文到管理器中 /// /// 架构类型 /// 架构上下文实例 /// 当指定类型的架构上下文已存在时抛出 public static void Bind(Type architectureType, IArchitectureContext context) { if (!ArchitectureDictionary.TryAdd(architectureType, context)) throw new InvalidOperationException( $"Architecture context for '{architectureType.Name}' already exists"); } /// /// 获取字典中的第一个架构上下文 /// /// 返回字典中的第一个架构上下文实例 /// 当字典为空时抛出 public static IArchitectureContext GetFirstArchitectureContext() { return ArchitectureDictionary.Values.First(); } /// /// 根据类型获取对应的架构上下文 /// /// 要查找的架构类型 /// 返回指定类型的架构上下文实例 /// 当指定类型的架构上下文不存在时抛出 public static IArchitectureContext GetByType(Type type) { if (ArchitectureDictionary.TryGetValue(type, out var context)) return context; throw new InvalidOperationException( $"Architecture context for '{type.Name}' not found"); } /// /// 获取指定类型的架构上下文实例 /// /// 架构上下文类型,必须实现IArchitectureContext接口 /// 指定类型的架构上下文实例 /// 当指定类型的架构上下文不存在时抛出 public static T Get() where T : class, IArchitectureContext { if (ArchitectureDictionary.TryGetValue(typeof(T), out var ctx)) return (T)ctx; throw new InvalidOperationException( $"Architecture context '{typeof(T).Name}' not found"); } /// /// 尝试获取指定类型的架构上下文实例 /// /// 架构上下文类型,必须实现IArchitectureContext接口 /// 输出参数,如果找到则返回对应的架构上下文实例,否则返回null /// 如果找到指定类型的架构上下文则返回true,否则返回false public static bool TryGet(out T? context) where T : class, IArchitectureContext { if (ArchitectureDictionary.TryGetValue(typeof(T), out var ctx)) { context = (T)ctx; return true; } context = null; return false; } /// /// 移除指定类型的架构上下文绑定 /// /// 要移除的架构类型 public static void Unbind(Type architectureType) { ArchitectureDictionary.TryRemove(architectureType, out _); } /// /// 清空所有架构上下文绑定 /// public static void Clear() { ArchitectureDictionary.Clear(); } }