AddScoped 依赖与 CancellationToke

AddScoped dependency with a CancellationToke

我有一个 .NET 核心依赖项,它的范围是每个 REST API 请求。它是通过调用 AddScoped.

添加到 Startup.ConfigureServices 中的

我想为此添加取消支持。如果我将 CancellationToken cancellationToken 添加到任何控制器操作的参数中,我可以获得一个令牌,如果客户端请求是,则该令牌将被取消。然后我可以将该令牌传递给依赖项上的所有方法。

但是,依赖项的范围仅限于请求,因此感觉没有必要通过操作将令牌向下传递给方法 - 我可以以某种方式将 CancellationToken 添加到范围内的依赖项吗?

could I just add the CancellationToken to the scoped dependency somehow?

嗯,从技术上讲是的。即通过注入 IHttpAccessor 和访问 HttpContext.RequestAborted 属性,如果定义了,这与您通常传递到控制器操作中的取消标记相同。

但实际上有点不鼓励使用动作参数重载,因为在每个控制器动作中,您都可以通过 HttpContext.RequestAborted 访问取消令牌,并将其放在控制器动作中有点使令牌 public,即当创建 Swagger 方案(至少在 2017 年是这样),其中使用 HttpContext 本身并没有将其暴露给 public.

唯一的例外似乎是,当使用不从 ControllerControllerBase 继承的“Poco 控制器”并且不将 IHttpAccessor 注入此控制器时。

但是将取消令牌注入任意服务是有问题的,因为您对 Web 框架有很强的依赖性 (IHttpAccessor/HttpContext)。

最好和最干净的方法是在您的方法中保留一个 CancellationToken 参数,该参数可以以有意义的方式取消并使令牌成为可选的,因此您只能在有请求的情况下传递参数或者可以取消的情况

public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}