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 GetFirstArchitecture()
{
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();
}
}