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.Systems;
using GFramework.Core.Abstractions.Utility;
using GFramework.Cqrs.Abstractions.Cqrs;
using ICommand = GFramework.Core.Abstractions.Command.ICommand;
namespace GFramework.Core.Abstractions.Architectures;
///
/// 架构上下文接口,统一暴露框架组件访问、兼容旧命令/查询总线,以及当前推荐的 CQRS 运行时入口。
///
///
/// 旧的 GFramework.Core.Abstractions.Command 与 GFramework.Core.Abstractions.Query 契约会继续通过原有 Command/Query Executor 路径执行,以保证存量代码兼容。
/// 新的 GFramework.Cqrs.Abstractions.Cqrs 契约由内置 CQRS dispatcher 统一处理,支持 request pipeline、notification publish 与 stream request。
/// 新功能优先使用 、 与对应的 CQRS Command/Query 重载;迁移旧代码时可先保留旧入口,再逐步替换为 CQRS 请求模型。
///
public interface IArchitectureContext : ICqrsContext
{
///
/// 获取指定类型的服务实例
///
/// 服务类型
/// 服务实例,如果不存在则抛出异常
TService GetService() where TService : class;
///
/// 获取指定类型的所有服务实例
///
/// 服务类型
/// 所有符合条件的服务实例列表
IReadOnlyList GetServices() where TService : class;
///
/// 获取指定类型的系统实例
///
/// 系统类型,必须继承自ISystem接口
/// 系统实例,如果不存在则抛出异常
TSystem GetSystem() where TSystem : class, ISystem;
///
/// 获取指定类型的所有系统实例
///
/// 系统类型,必须继承自ISystem接口
/// 所有符合条件的系统实例列表
IReadOnlyList GetSystems() where TSystem : class, ISystem;
///
/// 获取指定类型的模型实例
///
/// 模型类型,必须继承自IModel接口
/// 模型实例,如果不存在则抛出异常
TModel GetModel() where TModel : class, IModel;
///
/// 获取指定类型的所有模型实例
///
/// 模型类型,必须继承自IModel接口
/// 所有符合条件的模型实例列表
IReadOnlyList GetModels() where TModel : class, IModel;
///
/// 获取指定类型的工具类实例
///
/// 工具类类型,必须继承自IUtility接口
/// 工具类实例,如果不存在则抛出异常
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(ICommand command);
///
/// 发送一个新版 CQRS 命令并返回结果。
///
/// 命令响应类型。
/// 要发送的 CQRS 命令。
/// 命令执行结果。
///
/// 这是迁移后的推荐命令入口。无返回值命令应实现 IRequest<Unit>,并优先通过 调用。
///
TResponse SendCommand(GFramework.Cqrs.Abstractions.Cqrs.Command.ICommand command);
///
/// 异步发送一个旧版命令。
///
/// 要发送的旧版命令。
Task SendCommandAsync(IAsyncCommand command);
///
/// 异步发送一个新版 CQRS 命令并返回结果。
///
/// 命令响应类型。
/// 要发送的 CQRS 命令。
/// 取消令牌。
/// 包含命令执行结果的值任务。
ValueTask SendCommandAsync(
GFramework.Cqrs.Abstractions.Cqrs.Command.ICommand command,
CancellationToken cancellationToken = default);
///
/// 异步发送一个旧版带返回值命令。
///
/// 命令执行结果类型。
/// 要发送的旧版命令。
/// 命令执行结果。
Task SendCommandAsync(IAsyncCommand command);
///
/// 发送一个旧版查询请求。
///
/// 查询结果类型。
/// 要发送的旧版查询。
/// 查询结果。
TResult SendQuery(IQuery query);
///
/// 发送一个新版 CQRS 查询并返回结果。
///
/// 查询响应类型。
/// 要发送的 CQRS 查询。
/// 查询结果。
///
/// 这是迁移后的推荐查询入口。新查询应优先实现 GFramework.Cqrs.Abstractions.Cqrs.Query.IQuery<TResponse>。
///
TResponse SendQuery(GFramework.Cqrs.Abstractions.Cqrs.Query.IQuery query);
///
/// 异步发送一个旧版查询请求。
///
/// 查询结果类型。
/// 要发送的旧版异步查询。
/// 查询结果。
Task SendQueryAsync(IAsyncQuery query);
///
/// 异步发送一个新版 CQRS 查询并返回结果。
///
/// 查询响应类型。
/// 要发送的 CQRS 查询。
/// 取消令牌。
/// 包含查询结果的值任务。
ValueTask SendQueryAsync(GFramework.Cqrs.Abstractions.Cqrs.Query.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);
///
/// 发送新版 CQRS 请求,并统一处理命令与查询。
///
///
/// 这是自有 CQRS 运行时的主入口。新代码应优先通过该方法或 进入 dispatcher。
///
ValueTask SendRequestAsync(
IRequest request,
CancellationToken cancellationToken = default);
///
/// 发送新版 CQRS 请求的同步包装版本。
///
///
/// 仅为兼容同步调用链保留;新代码应优先使用异步入口,避免阻塞当前线程。
///
TResponse SendRequest(IRequest request);
///
/// 发布新版 CQRS 通知。
///
///
/// 该入口用于一对多通知分发,与框架级 EventBus 事件系统并存,适合围绕请求处理过程传播领域通知。
///
ValueTask PublishAsync(
TNotification notification,
CancellationToken cancellationToken = default)
where TNotification : INotification;
///
/// 创建新版 CQRS 流式请求。
///
///
/// 适用于需要按序惰性产出大量结果的场景。调用方应消费返回的异步序列,而不是回退到旧版查询总线。
///
IAsyncEnumerable CreateStream(
IStreamRequest request,
CancellationToken cancellationToken = default);
// === 便捷扩展方法 ===
///
/// 发送一个无返回值的新版 CQRS 命令。
///
ValueTask SendAsync(
TCommand command,
CancellationToken cancellationToken = default)
where TCommand : IRequest;
///
/// 发送一个有返回值的新版 CQRS 请求。
///
ValueTask SendAsync(
IRequest command,
CancellationToken cancellationToken = default);
///
/// 获取环境对象
///
/// 环境对象实例
IEnvironment GetEnvironment();
}