GFramework/GFramework.Cqrs/Extensions/ContextAwareCqrsExtensions.cs
gewuyou ff553977e3 chore(license): 补齐 Apache-2.0 文件头治理
- 新增许可证文件头检查与修复脚本

- 补充维护者手动修复 PR 工作流和 CI 校验

- 更新贡献指南中的文件头说明

- 补齐仓库维护源码和配置文件的许可证声明
2026-05-03 19:39:49 +08:00

145 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using GFramework.Core.Abstractions.Rule;
using GFramework.Cqrs.Abstractions.Cqrs;
namespace GFramework.Cqrs.Extensions;
/// <summary>
/// 提供对 <see cref="IContextAware" /> 接口的 CQRS 统一扩展方法。
/// 这些扩展直接委托给架构上下文的内建 CQRS runtime作为新的中性命名入口。
/// </summary>
public static class ContextAwareCqrsExtensions
{
/// <summary>
/// 发送请求(统一处理 Command/Query
/// </summary>
/// <typeparam name="TResponse">响应类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="request">要发送的请求。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>请求结果。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="request" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static ValueTask<TResponse> SendRequestAsync<TResponse>(
this IContextAware contextAware,
IRequest<TResponse> request,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
return contextAware.GetContext().SendRequestAsync(request, cancellationToken);
}
/// <summary>
/// 发送请求(同步版本,不推荐)。
/// </summary>
/// <typeparam name="TResponse">响应类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="request">要发送的请求。</param>
/// <returns>请求结果。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="request" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static TResponse SendRequest<TResponse>(this IContextAware contextAware, IRequest<TResponse> request)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
return contextAware.GetContext().SendRequest(request);
}
/// <summary>
/// 发布通知(一对多事件)。
/// </summary>
/// <typeparam name="TNotification">通知类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="notification">要发布的通知。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>异步任务。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="notification" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static ValueTask PublishAsync<TNotification>(
this IContextAware contextAware,
TNotification notification,
CancellationToken cancellationToken = default)
where TNotification : INotification
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(notification);
return contextAware.GetContext().PublishAsync(notification, cancellationToken);
}
/// <summary>
/// 创建流式请求。
/// </summary>
/// <typeparam name="TResponse">响应类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="request">流式请求。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>异步响应流。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="request" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static IAsyncEnumerable<TResponse> CreateStream<TResponse>(
this IContextAware contextAware,
IStreamRequest<TResponse> request,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(request);
return contextAware.GetContext().CreateStream(request, cancellationToken);
}
/// <summary>
/// 发送无返回值命令。
/// </summary>
/// <typeparam name="TCommand">命令类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="command">要发送的命令。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>异步任务。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="command" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static ValueTask SendAsync<TCommand>(
this IContextAware contextAware,
TCommand command,
CancellationToken cancellationToken = default)
where TCommand : IRequest<Unit>
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
return contextAware.GetContext().SendAsync(command, cancellationToken);
}
/// <summary>
/// 发送带返回值命令。
/// </summary>
/// <typeparam name="TResponse">响应类型。</typeparam>
/// <param name="contextAware">实现 <see cref="IContextAware" /> 接口的对象。</param>
/// <param name="command">要发送的命令。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>命令执行结果。</returns>
/// <exception cref="ArgumentNullException">
/// 当 <paramref name="contextAware" /> 或 <paramref name="command" /> 为 <see langword="null" /> 时抛出。
/// </exception>
public static ValueTask<TResponse> SendAsync<TResponse>(
this IContextAware contextAware,
IRequest<TResponse> command,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(contextAware);
ArgumentNullException.ThrowIfNull(command);
return contextAware.GetContext().SendAsync(command, cancellationToken);
}
}