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();
}
#endregion
}