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; namespace GFramework.Core.extensions; /// /// 提供对 IContextAware 接口的扩展方法 /// public static class ContextAwareExtensions { /// /// 获取架构上下文中的指定系统 /// /// 目标系统类型 /// 实现 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 或 query 为 null 时抛出 public static TResult SendQuery(this IContextAware contextAware, IQuery query) { ArgumentNullException.ThrowIfNull(contextAware); ArgumentNullException.ThrowIfNull(query); var context = contextAware.GetContext(); return context.SendQuery(query); } /// /// 发送并异步执行一个无返回值的命令 /// /// 实现 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); } /// /// 发送一个事件 /// /// 事件类型 /// 实现 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 接口的对象 /// 要发送的命令 /// 命令执行结果 /// 当 contextAware 或 command 为 null 时抛出 public static TResult SendCommand(this IContextAware contextAware, 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, ICommand command) { ArgumentNullException.ThrowIfNull(contextAware); ArgumentNullException.ThrowIfNull(command); var context = contextAware.GetContext(); context.SendCommand(command); } /// /// 注册事件处理器 /// /// 事件类型 /// 实现 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(); } }