using GFramework.Core.Abstractions.model;
using GFramework.Core.Abstractions.rule;
using GFramework.Core.Abstractions.system;
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
}