using GFramework.Core.Abstractions.command;
using GFramework.Core.Abstractions.environment;
using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.model;
using GFramework.Core.Abstractions.query;
using GFramework.Core.Abstractions.rule;
using GFramework.Core.Abstractions.system;
using GFramework.Core.Abstractions.utility;
using Mediator;
namespace GFramework.Core.extensions;
///
/// 提供对 IContextAware 接口的扩展方法
///
public static class ContextAwareExtensions
{
///
/// 从上下文感知对象中获取指定类型的服务
///
/// 要获取的服务类型
/// 实现 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();
}
///
/// 发送一个事件
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 当 contextAware 为 null 时抛出
public static void SendEvent(this IContextAware contextAware) where TEvent : new()
{
ArgumentNullException.ThrowIfNull(contextAware);
var context = contextAware.GetContext();
context.SendEvent();
}
///
/// 发送一个具体的事件实例
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 事件实例
/// 当 contextAware 或 e 为 null 时抛出
public static void SendEvent(this IContextAware contextAware, TEvent e) where TEvent : class
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(e);
var context = contextAware.GetContext();
context.SendEvent(e);
}
///
/// 注册事件处理器
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 事件处理委托
/// 事件注销接口
public static IUnRegister RegisterEvent(this IContextAware contextAware, Action handler)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(handler);
var context = contextAware.GetContext();
return context.RegisterEvent(handler);
}
///
/// 取消对某类型事件的监听
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 之前绑定的事件处理器
public static void UnRegisterEvent(this IContextAware contextAware, Action onEvent)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(onEvent);
// 获取上下文对象并取消事件注册
var context = contextAware.GetContext();
context.UnRegisterEvent(onEvent);
}
///
/// 获取指定类型的环境对象
///
/// 要获取的环境对象类型
/// 上下文感知对象
/// 指定类型的环境对象,如果无法转换则返回null
public static T? GetEnvironment(this IContextAware contextAware) where T : class
{
ArgumentNullException.ThrowIfNull(contextAware);
// 获取上下文对象并返回其环境
var context = contextAware.GetContext();
return context.GetEnvironment() as T;
}
///
/// 获取环境对象
///
/// 上下文感知对象
/// 环境对象
public static IEnvironment GetEnvironment(this IContextAware contextAware)
{
ArgumentNullException.ThrowIfNull(contextAware);
// 获取上下文对象并返回其环境
var context = contextAware.GetContext();
return context.GetEnvironment();
}
///
/// [Mediator] 发送命令的同步版本(不推荐,仅用于兼容性)
///
/// 命令响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令对象
/// 命令执行结果
/// 当 contextAware 或 command 为 null 时抛出
public static TResponse SendCommand(this IContextAware contextAware,
Mediator.ICommand command)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return context.SendCommand(command);
}
///
/// 发送一个带返回结果的命令
///
/// 命令执行结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 命令执行结果
/// 当 contextAware 或 command 为 null 时抛出
public static TResult SendCommand(this IContextAware contextAware,
Abstractions.command.ICommand command)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return context.SendCommand(command);
}
///
/// 发送一个无返回结果的命令
///
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 当 contextAware 或 command 为 null 时抛出
public static void SendCommand(this IContextAware contextAware, Abstractions.command.ICommand command)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
context.SendCommand(command);
}
///
/// [Mediator] 异步发送命令并返回结果
///
/// 命令响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令对象
/// 取消令牌,用于取消操作
/// 包含命令执行结果的ValueTask
/// 当 contextAware 或 command 为 null 时抛出
public static ValueTask SendCommandAsync(this IContextAware contextAware,
Mediator.ICommand command, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return context.SendCommandAsync(command, cancellationToken);
}
///
/// 发送并异步执行一个无返回值的命令
///
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 当 contextAware 或 command 为 null 时抛出
public static async Task SendCommandAsync(this IContextAware contextAware, IAsyncCommand command)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
await context.SendCommandAsync(command);
}
///
/// 发送并异步执行一个带返回值的命令
///
/// 命令执行结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 命令执行结果
/// 当 contextAware 或 command 为 null 时抛出
public static async Task SendCommandAsync(this IContextAware contextAware,
IAsyncCommand command)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return await context.SendCommandAsync(command);
}
///
/// [Mediator] 发送查询的同步版本(不推荐,仅用于兼容性)
///
/// 查询响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的查询对象
/// 查询结果
/// 当 contextAware 或 query 为 null 时抛出
public static TResponse SendQuery(this IContextAware contextAware, Mediator.IQuery query)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(query);
var context = contextAware.GetContext();
return context.SendQuery(query);
}
///
/// 发送一个查询请求
///
/// 查询结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的查询
/// 查询结果
/// 当 contextAware 或 query 为 null 时抛出
public static TResult SendQuery(this IContextAware contextAware, Abstractions.query.IQuery query)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(query);
var context = contextAware.GetContext();
return context.SendQuery(query);
}
///
/// [Mediator] 异步发送查询并返回结果
///
/// 查询响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的查询对象
/// 取消令牌,用于取消操作
/// 包含查询结果的ValueTask
/// 当 contextAware 或 query 为 null 时抛出
public static ValueTask SendQueryAsync(this IContextAware contextAware,
Mediator.IQuery query, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(query);
var context = contextAware.GetContext();
return context.SendQueryAsync(query, cancellationToken);
}
///
/// 异步发送一个查询请求
///
/// 查询结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的异步查询
/// 查询结果
/// 当 contextAware 或 query 为 null 时抛出
public static async Task SendQueryAsync(this IContextAware contextAware,
IAsyncQuery query)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(query);
var context = contextAware.GetContext();
return await context.SendQueryAsync(query);
}
// === 统一请求处理方法 ===
///
/// 发送请求(统一处理 Command/Query)
///
/// 响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的请求
/// 取消令牌
/// 请求结果
/// 当 contextAware 或 request 为 null 时抛出
public static ValueTask SendRequestAsync(this IContextAware contextAware,
IRequest request, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
var context = contextAware.GetContext();
return context.SendRequestAsync(request, cancellationToken);
}
///
/// 发送请求(同步版本,不推荐)
///
/// 响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的请求
/// 请求结果
/// 当 contextAware 或 request 为 null 时抛出
public static TResponse SendRequest(this IContextAware contextAware,
IRequest request)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
var context = contextAware.GetContext();
return context.SendRequest(request);
}
///
/// 发布通知(一对多事件)
///
/// 通知类型
/// 实现 IContextAware 接口的对象
/// 要发布的通知
/// 取消令牌
/// 异步任务
/// 当 contextAware 或 notification 为 null 时抛出
public static ValueTask PublishAsync(this IContextAware contextAware,
TNotification notification, CancellationToken cancellationToken = default)
where TNotification : INotification
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(notification);
var context = contextAware.GetContext();
return context.PublishAsync(notification, cancellationToken);
}
///
/// 创建流式请求(用于大数据集)
///
/// 响应类型
/// 实现 IContextAware 接口的对象
/// 流式请求
/// 取消令牌
/// 异步响应流
/// 当 contextAware 或 request 为 null 时抛出
public static IAsyncEnumerable CreateStream(this IContextAware contextAware,
IStreamRequest request, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
var context = contextAware.GetContext();
return context.CreateStream(request, cancellationToken);
}
// === 便捷扩展方法 ===
///
/// 发送命令(无返回值)
///
/// 命令类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 取消令牌
/// 异步任务
/// 当 contextAware 或 command 为 null 时抛出
public static ValueTask SendAsync(this IContextAware contextAware, TCommand command,
CancellationToken cancellationToken = default)
where TCommand : IRequest
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return context.SendAsync(command, cancellationToken);
}
///
/// 发送命令(有返回值)
///
/// 响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 取消令牌
/// 命令执行结果
/// 当 contextAware 或 command 为 null 时抛出
public static ValueTask SendAsync(this IContextAware contextAware,
IRequest command, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
var context = contextAware.GetContext();
return context.SendAsync(command, cancellationToken);
}
///
/// 发送查询
///
/// 响应类型
/// 实现 IContextAware 接口的对象
/// 要发送的查询
/// 取消令牌
/// 查询结果
/// 当 contextAware 或 query 为 null 时抛出
public static ValueTask QueryAsync(this IContextAware contextAware,
IRequest query, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(query);
var context = contextAware.GetContext();
return context.QueryAsync(query, cancellationToken);
}
///
/// 发布事件通知
///
/// 通知类型
/// 实现 IContextAware 接口的对象
/// 要发布的通知
/// 取消令牌
/// 异步任务
/// 当 contextAware 或 notification 为 null 时抛出
public static ValueTask PublishEventAsync(this IContextAware contextAware,
TNotification notification, CancellationToken cancellationToken = default)
where TNotification : INotification
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(notification);
var context = contextAware.GetContext();
return context.PublishEventAsync(notification, cancellationToken);
}
}