using GFramework.Core.Abstractions.command;
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
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
var context = contextAware.GetContext();
return context.GetSystem();
}
///
/// 获取架构上下文中的指定模型
///
/// 目标模型类型
/// 实现 IContextAware 接口的对象
/// 指定类型的模型实例
/// 当 contextAware 为 null 时抛出
public static TModel? GetModel(this IContextAware contextAware) where TModel : class, IModel
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
var context = contextAware.GetContext();
return context.GetModel();
}
///
/// 获取架构上下文中的指定工具
///
/// 目标工具类型
/// 实现 IContextAware 接口的对象
/// 指定类型的工具实例
/// 当 contextAware 为 null 时抛出
public static TUtility? GetUtility(this IContextAware contextAware) where TUtility : class, IUtility
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
var context = contextAware.GetContext();
return context.GetUtility();
}
///
/// 发送一个查询请求
///
/// 查询结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的查询
/// 查询结果
/// 当 contextAware 或 query 为 null 时抛出
public static TResult SendQuery(this IContextAware contextAware, IQuery query)
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (query == null) throw new ArgumentNullException(nameof(query));
var context = contextAware.GetContext();
return context.SendQuery(query);
}
///
/// 发送一个无返回结果的命令
///
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 当 contextAware 或 command 为 null 时抛出
public static void SendCommand(this IContextAware contextAware, ICommand command)
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (command == null) throw new ArgumentNullException(nameof(command));
var context = contextAware.GetContext();
context.SendCommand(command);
}
///
/// 发送一个带返回值的命令
///
/// 命令执行结果类型
/// 实现 IContextAware 接口的对象
/// 要发送的命令
/// 命令执行结果
/// 当 contextAware 或 command 为 null 时抛出
public static TResult SendCommand(this IContextAware contextAware, ICommand command)
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (command == null) throw new ArgumentNullException(nameof(command));
var context = contextAware.GetContext();
return context.SendCommand(command);
}
///
/// 发送一个事件
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 当 contextAware 为 null 时抛出
public static void SendEvent(this IContextAware contextAware) where TEvent : new()
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
var context = contextAware.GetContext();
context.SendEvent();
}
///
/// 发送一个具体的事件实例
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 事件实例
/// 当 contextAware 或 e 为 null 时抛出
public static void SendEvent(this IContextAware contextAware, TEvent e) where TEvent : class
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (e == null) throw new ArgumentNullException(nameof(e));
var context = contextAware.GetContext();
context.SendEvent(e);
}
///
/// 注册事件处理器
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 事件处理委托
/// 事件注销接口
public static IUnRegister RegisterEvent(this IContextAware contextAware, Action handler)
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (handler == null) throw new ArgumentNullException(nameof(handler));
var context = contextAware.GetContext();
return context.RegisterEvent(handler);
}
///
/// 取消对某类型事件的监听
///
/// 事件类型
/// 实现 IContextAware 接口的对象
/// 之前绑定的事件处理器
public static void UnRegisterEvent(this IContextAware contextAware, Action onEvent)
{
if (contextAware == null) throw new ArgumentNullException(nameof(contextAware));
if (onEvent == null) throw new ArgumentNullException(nameof(onEvent));
var context = contextAware.GetContext();
context.UnRegisterEvent(onEvent);
}
}