// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
namespace GFramework.Cqrs.Abstractions.Cqrs;
///
/// 定义架构上下文使用的 CQRS runtime seam。
/// 该抽象把请求分发、通知发布与流式处理从具体实现中解耦,
/// 使 CQRS runtime 契约可独立归属到 GFramework.Cqrs.Abstractions。
///
public interface ICqrsRuntime
{
///
/// 发送请求并返回响应。
///
/// 响应类型。
/// 当前 CQRS 分发上下文。
/// 要分发的请求。
/// 取消令牌。
/// 请求响应。
///
/// 或 为 。
///
///
/// 当前上下文无法满足运行时要求,例如未找到对应请求处理器,或请求处理链中的
/// IContextAware 对象需要 IArchitectureContext 但当前 不提供该能力。
///
///
/// 该契约允许调用方传入任意 ,
/// 但默认运行时在需要向处理器或行为注入框架上下文时,仍要求该上下文同时实现 IArchitectureContext。
///
ValueTask SendAsync(
ICqrsContext context,
IRequest request,
CancellationToken cancellationToken = default);
///
/// 发布通知到所有已注册处理器。
///
/// 通知类型。
/// 当前 CQRS 分发上下文。
/// 要发布的通知。
/// 取消令牌。
/// 表示通知分发完成的值任务。
///
/// 或 为 。
///
///
/// 已解析到的通知处理器需要框架级上下文注入,但当前 不提供
/// IArchitectureContext 能力。
///
///
/// 默认实现允许零处理器场景静默完成;只有在处理器注入前置条件不满足时才会抛出异常。
///
ValueTask PublishAsync(
ICqrsContext context,
TNotification notification,
CancellationToken cancellationToken = default)
where TNotification : INotification;
///
/// 创建流式请求的异步响应序列。
///
/// 流元素类型。
/// 当前 CQRS 分发上下文。
/// 流式请求。
/// 取消令牌。
/// 按需生成的异步响应序列。
///
/// 或 为 。
///
///
/// 当前上下文无法满足运行时要求,例如未找到对应流式处理器,或流式处理链中的
/// IContextAware 对象需要 IArchitectureContext 但当前 不提供该能力。
///
///
/// 返回的异步序列在枚举前通常已完成处理器解析与上下文注入,
/// 因此调用方应把 视为整个枚举生命周期内的必需依赖。
///
IAsyncEnumerable CreateStream(
ICqrsContext context,
IStreamRequest request,
CancellationToken cancellationToken = default);
}