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); } }