mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 08:44:29 +08:00
- 修复测试辅助类型的只读暴露、空安全和线程安全问题 - 更新异步查询结果命名与init属性XML文档,保持语义一致 - 同步ai-plan恢复点与验证真值,记录PR298 nitpick跟进
42 lines
1.6 KiB
C#
42 lines
1.6 KiB
C#
using System.Threading;
|
|
using GFramework.Cqrs.Abstractions.Cqrs;
|
|
|
|
namespace GFramework.Core.Tests.Architectures;
|
|
|
|
/// <summary>
|
|
/// 记录请求通过管道次数的测试行为。
|
|
/// </summary>
|
|
/// <typeparam name="TRequest">请求类型。</typeparam>
|
|
/// <typeparam name="TResponse">响应类型。</typeparam>
|
|
public sealed class TrackingPipelineBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
|
|
where TRequest : IRequest<TResponse>
|
|
{
|
|
private static int _invocationCount;
|
|
|
|
/// <summary>
|
|
/// 获取当前测试进程中该请求类型对应的行为触发次数。
|
|
/// 该计数器是按泛型闭包共享的静态状态,测试需要在每次运行前显式重置。
|
|
/// </summary>
|
|
public static int InvocationCount
|
|
{
|
|
get => Volatile.Read(ref _invocationCount);
|
|
set => Volatile.Write(ref _invocationCount, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 以线程安全方式记录一次行为执行,然后继续执行下一个处理器。
|
|
/// </summary>
|
|
/// <param name="message">当前请求消息。</param>
|
|
/// <param name="next">下一个处理委托。</param>
|
|
/// <param name="cancellationToken">取消令牌。</param>
|
|
/// <returns>下游处理器的响应结果。</returns>
|
|
public async ValueTask<TResponse> Handle(
|
|
TRequest message,
|
|
MessageHandlerDelegate<TRequest, TResponse> next,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
Interlocked.Increment(ref _invocationCount);
|
|
return await next(message, cancellationToken).ConfigureAwait(false);
|
|
}
|
|
}
|