GeWuYou c82a15f8bc refactor(abstractions): 将Architecture命名空间重命名为Architectures
- 更新所有引用GFramework.Core.Abstractions.Architecture的文件
- 将ArchitectureModuleRegistry.cs从Architecture目录移动到Architectures目录
- 将IArchitecture.cs从Architecture目录移动到Architectures目录
- 将IArchitectureConfiguration.cs从Architecture目录移动到Architectures目录
- 将IArchitectureContext.cs从Architecture目录移动到Architectures目录
- 将IArchitectureContextProvider.cs从Architecture目录移动到Architectures目录
- 将IArchitectureLifecycleHook.cs从Architecture目录移动到Architectures目录
- 将IArchitectureModule.cs从Architecture目录移动到Architectures目录
- 将IArchitecturePhaseListener.cs从Architecture目录移动到Architectures目录
- 将IArchitectureServices.cs从Architecture目录移动到Architectures目录
- 将IServiceModule.cs从Architecture目录移动到Architectures目录
- 将IServiceModuleManager.cs从Architecture目录移动到Architectures目录
- 在ArchitectureModuleRegistry中将私有字段_factories重命名为Factories并添加StringComparer.Ordinal参数
2026-03-14 16:52:28 +08:00

111 lines
4.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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