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.CommandGFramework.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(); }