Skip to content

责任链

命名空间:DesignPatterns.Behavioral

概述

有序 Handler 处理共享上下文;可短路(不调用 next)或继续管道。异步优先:ValueTask + CancellationToken

运行时

类型说明
IHandler<TContext>InvokeAsync(context, next, cancellationToken)
HandlerPipelineBuilder<TContext>Use(handler) / Use(delegate),再 Build()
HandlerPipeline<TContext>不可变管道 — InvokeAsyncInvokeTracedAsync
HandlerPipelineTrace单次调用的步骤列表
HandlerPipelineStep索引、显示名、HandlerPipelineStepStatus
HandlerPipelineStepStatusCompleted / ShortCircuited / NotReached

短路

  • 调用 await next(context, ct) → 后续 Handler 继续执行。
  • 调用 next → 跳过后续 Handler。

可追踪调用(InvokeTracedAsync

调试鉴权拦截、早退时,无需引入完整中间件框架:

csharp
var trace = await pipeline.InvokeTracedAsync(context, cancellationToken);

foreach (var step in trace.Steps)
{
    Console.WriteLine($"{step.Index}: {step.Name} → {step.Status}");
}
状态含义
Completed已执行且调用了 next
ShortCircuited已执行但调用 next
NotReached未执行(更早 Handler 短路)

InvokeTracedAsync 不改变执行顺序与短路语义,仅返回 trace;委托 Handler 显示为 "<delegate>"

源生成器

在 Handler 上使用 [HandlerOrder(n, typeof(TContext))]。生成器发出 {Context}HandlerPipeline

诊断

DP005、DP008–DP009、DP024(未注册 Handler 为 Info + CodeFix)。

示例

DesignPatterns.Samples.Chain

维护者文档:docs/ChainOfResponsibility.md

英文版:Chain of Responsibility

基于 MIT 许可证发布。