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.System;
using GFramework.Core.Abstractions.Utility;
using Mediator;
using ICommand = GFramework.Core.Abstractions.Command.ICommand;
namespace GFramework.Core.Abstractions.Architecture;
///
/// 架构上下文接口,提供对系统、模型、工具类的访问以及命令、查询、事件的发送和注册功能
///
public interface IArchitectureContext
{
///
/// 获取指定类型的服务实例
///
/// 服务类型
/// 服务实例,如果不存在则返回null
TService? GetService() where TService : class;
///
/// 获取指定类型的所有服务实例
///
/// 服务类型
/// 所有符合条件的服务实例列表
IReadOnlyList GetServices() where TService : class;
///
/// 获取指定类型的系统实例
///
/// 系统类型,必须继承自ISystem接口
/// 系统实例,如果不存在则返回null
TSystem? GetSystem() where TSystem : class, ISystem;
///
/// 获取指定类型的所有系统实例
///
/// 系统类型,必须继承自ISystem接口
/// 所有符合条件的系统实例列表
IReadOnlyList GetSystems() where TSystem : class, ISystem;
///
/// 获取指定类型的模型实例
///
/// 模型类型,必须继承自IModel接口
/// 模型实例,如果不存在则返回null
TModel? GetModel() where TModel : class, IModel;
///
/// 获取指定类型的所有模型实例
///
/// 模型类型,必须继承自IModel接口
/// 所有符合条件的模型实例列表
IReadOnlyList GetModels() where TModel : class, IModel;
///
/// 获取指定类型的工具类实例
///
/// 工具类类型,必须继承自IUtility接口
/// 工具类实例,如果不存在则返回null
TUtility? GetUtility() where TUtility : class, IUtility;
///
/// 获取指定类型的所有工具类实例
///
/// 工具类类型,必须继承自IUtility接口
/// 所有符合条件的工具类实例列表
IReadOnlyList GetUtilities() where TUtility : class, IUtility;
///
/// 获取指定类型的所有服务实例,并按优先级排序
/// 实现 IPrioritized 接口的服务将按优先级排序(数值越小优先级越高)
///
/// 服务类型
/// 按优先级排序后的服务实例列表
IReadOnlyList GetServicesByPriority() where TService : class;
///
/// 获取指定类型的所有系统实例,并按优先级排序
/// 实现 IPrioritized 接口的系统将按优先级排序(数值越小优先级越高)
///
/// 系统类型,必须继承自ISystem接口
/// 按优先级排序后的系统实例列表
IReadOnlyList GetSystemsByPriority() where TSystem : class, ISystem;
///
/// 获取指定类型的所有模型实例,并按优先级排序
/// 实现 IPrioritized 接口的模型将按优先级排序(数值越小优先级越高)
///
/// 模型类型,必须继承自IModel接口
/// 按优先级排序后的模型实例列表
IReadOnlyList GetModelsByPriority() where TModel : class, IModel;
///
/// 获取指定类型的所有工具类实例,并按优先级排序
/// 实现 IPrioritized 接口的工具将按优先级排序(数值越小优先级越高)
///
/// 工具类类型,必须继承自IUtility接口
/// 按优先级排序后的工具类实例列表
IReadOnlyList GetUtilitiesByPriority() where TUtility : class, IUtility;
///
/// 发送一个命令
///
/// 要发送的命令
void SendCommand(ICommand command);
///
/// 发送一个带返回值的命令
///
/// 命令执行结果类型
/// 要发送的命令
/// 命令执行结果
TResult SendCommand(Command.ICommand command);
///
/// [Mediator] 发送命令的同步版本(不推荐,仅用于兼容性)
///
/// 命令响应类型
/// 要发送的命令对象
/// 命令执行结果
TResponse SendCommand(Mediator.ICommand command);
///
/// 发送并异步执行一个命令
///
/// 要发送的命令
Task SendCommandAsync(IAsyncCommand command);
///
/// [Mediator] 异步发送命令并返回结果
/// 通过Mediator模式发送命令请求,支持取消操作
///
/// 命令响应类型
/// 要发送的命令对象
/// 取消令牌,用于取消操作
/// 包含命令执行结果的ValueTask
ValueTask SendCommandAsync(Mediator.ICommand command,
CancellationToken cancellationToken = default);
///
/// 发送并异步执行一个带返回值的命令
///
/// 命令执行结果类型
/// 要发送的命令
/// 命令执行结果
Task SendCommandAsync(IAsyncCommand command);
///
/// 发送一个查询请求
///
/// 查询结果类型
/// 要发送的查询
/// 查询结果
TResult SendQuery(Query.IQuery query);
///
/// [Mediator] 发送查询的同步版本(不推荐,仅用于兼容性)
///
/// 查询响应类型
/// 要发送的查询对象
/// 查询结果
TResponse SendQuery(Mediator.IQuery query);
///
/// 异步发送一个查询请求
///
/// 查询结果类型
/// 要发送的异步查询
/// 查询结果
Task SendQueryAsync(IAsyncQuery query);
///
/// [Mediator] 异步发送查询并返回结果
/// 通过Mediator模式发送查询请求,支持取消操作
///
/// 查询响应类型
/// 要发送的查询对象
/// 取消令牌,用于取消操作
/// 包含查询结果的ValueTask
ValueTask SendQueryAsync(Mediator.IQuery query,
CancellationToken cancellationToken = default);
///
/// 发送一个事件
///
/// 事件类型,必须具有无参构造函数
void SendEvent() where TEvent : new();
///
/// 发送一个带参数的事件
///
/// 事件类型
/// 事件参数
void SendEvent(TEvent e) where TEvent : class;
///
/// 注册事件处理器
///
/// 事件类型
/// 事件处理委托
/// 事件注销接口
IUnRegister RegisterEvent(Action handler);
///
/// 取消注册事件监听器
///
/// 事件类型
/// 要取消注册的事件回调方法
void UnRegisterEvent(Action onEvent);
///
/// 发送请求(统一处理 Command/Query)
///
ValueTask SendRequestAsync(
IRequest request,
CancellationToken cancellationToken = default);
///
/// 发送请求(同步版本,不推荐)
///
TResponse SendRequest(IRequest request);
///
/// 发布通知(一对多事件)
///
ValueTask PublishAsync(
TNotification notification,
CancellationToken cancellationToken = default)
where TNotification : INotification;
///
/// 创建流式请求(用于大数据集)
///
IAsyncEnumerable CreateStream(
IStreamRequest request,
CancellationToken cancellationToken = default);
// === 便捷扩展方法 ===
///
/// 发送命令(无返回值)
///
ValueTask SendAsync(
TCommand command,
CancellationToken cancellationToken = default)
where TCommand : IRequest;
///
/// 发送命令(有返回值)
///
ValueTask SendAsync(
IRequest command,
CancellationToken cancellationToken = default);
///
/// 获取环境对象
///
/// 环境对象实例
IEnvironment GetEnvironment();
}