using GFramework.Core.Abstractions.Model; using GFramework.Core.Abstractions.Rule; using GFramework.Core.Abstractions.Systems; using GFramework.Core.Abstractions.Utility; namespace GFramework.Core.Extensions; /// /// 提供对 IContextAware 接口的服务访问扩展方法 /// 包含单例和批量获取服务、系统、模型、工具的方法 /// public static class ContextAwareServiceExtensions { #region 单例获取 /// /// 从上下文感知对象中获取指定类型的服务 /// /// 要获取的服务类型 /// 实现 IContextAware 接口的上下文感知对象 /// 指定类型的服务实例,如果未找到则返回 null /// 当 contextAware 参数为 null 时抛出 public static TService? GetService(this IContextAware contextAware) where TService : class { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetService(); } /// /// 获取架构上下文中的指定系统 /// /// 目标系统类型 /// 实现 IContextAware 接口的对象 /// 指定类型的系统实例 /// 当 contextAware 为 null 时抛出 public static TSystem? GetSystem(this IContextAware contextAware) where TSystem : class, ISystem { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetSystem(); } /// /// 获取架构上下文中的指定模型 /// /// 目标模型类型 /// 实现 IContextAware 接口的对象 /// 指定类型的模型实例 /// 当 contextAware 为 null 时抛出 public static TModel? GetModel(this IContextAware contextAware) where TModel : class, IModel { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetModel(); } /// /// 获取架构上下文中的指定工具 /// /// 目标工具类型 /// 实现 IContextAware 接口的对象 /// 指定类型的工具实例 /// 当 contextAware 为 null 时抛出 public static TUtility? GetUtility(this IContextAware contextAware) where TUtility : class, IUtility { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetUtility(); } #endregion #region 批量获取 /// /// 从上下文感知对象中获取指定类型的所有服务 /// /// 要获取的服务类型 /// 实现 IContextAware 接口的上下文感知对象 /// 所有符合条件的服务实例列表 /// 当 contextAware 参数为 null 时抛出 public static IReadOnlyList GetServices(this IContextAware contextAware) where TService : class { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetServices(); } /// /// 获取架构上下文中的所有指定系统 /// /// 目标系统类型 /// 实现 IContextAware 接口的对象 /// 所有符合条件的系统实例列表 /// 当 contextAware 为 null 时抛出 public static IReadOnlyList GetSystems(this IContextAware contextAware) where TSystem : class, ISystem { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetSystems(); } /// /// 获取架构上下文中的所有指定模型 /// /// 目标模型类型 /// 实现 IContextAware 接口的对象 /// 所有符合条件的模型实例列表 /// 当 contextAware 为 null 时抛出 public static IReadOnlyList GetModels(this IContextAware contextAware) where TModel : class, IModel { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetModels(); } /// /// 获取架构上下文中的所有指定工具 /// /// 目标工具类型 /// 实现 IContextAware 接口的对象 /// 所有符合条件的工具实例列表 /// 当 contextAware 为 null 时抛出 public static IReadOnlyList GetUtilities(this IContextAware contextAware) where TUtility : class, IUtility { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetUtilities(); } /// /// 获取指定类型的所有服务实例,并按优先级排序 /// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高) /// /// 服务类型 /// 上下文感知对象 /// 按优先级排序后的服务实例列表 public static IReadOnlyList GetServicesByPriority(this IContextAware contextAware) where TService : class { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetServicesByPriority(); } /// /// 获取指定类型的所有系统实例,并按优先级排序 /// 实现 IPrioritized 接口的系统将按优先级排序(数值越小优先级越高) /// /// 系统类型 /// 上下文感知对象 /// 按优先级排序后的系统实例列表 public static IReadOnlyList GetSystemsByPriority(this IContextAware contextAware) where TSystem : class, ISystem { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetSystemsByPriority(); } /// /// 获取指定类型的所有模型实例,并按优先级排序 /// 实现 IPrioritized 接口的模型将按优先级排序(数值越小优先级越高) /// /// 模型类型 /// 上下文感知对象 /// 按优先级排序后的模型实例列表 public static IReadOnlyList GetModelsByPriority(this IContextAware contextAware) where TModel : class, IModel { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetModelsByPriority(); } /// /// 获取指定类型的所有工具实例,并按优先级排序 /// 实现 IPrioritized 接口的工具将按优先级排序(数值越小优先级越高) /// /// 工具类型 /// 上下文感知对象 /// 按优先级排序后的工具实例列表 public static IReadOnlyList GetUtilitiesByPriority(this IContextAware contextAware) where TUtility : class, IUtility { ArgumentNullException.ThrowIfNull(contextAware); var context = contextAware.GetContext(); return context.GetUtilitiesByPriority(); } #endregion }