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.
唯一的例外似乎是,当使用不从 Controller
或 ControllerBase
继承的“Poco 控制器”并且不将 IHttpAccessor
注入此控制器时。
但是将取消令牌注入任意服务是有问题的,因为您对 Web 框架有很强的依赖性 (IHttpAccessor
/HttpContext
)。
最好和最干净的方法是在您的方法中保留一个 CancellationToken
参数,该参数可以以有意义的方式取消并使令牌成为可选的,因此您只能在有请求的情况下传递参数或者可以取消的情况
public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}
我有一个 .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.
唯一的例外似乎是,当使用不从 Controller
或 ControllerBase
继承的“Poco 控制器”并且不将 IHttpAccessor
注入此控制器时。
但是将取消令牌注入任意服务是有问题的,因为您对 Web 框架有很强的依赖性 (IHttpAccessor
/HttpContext
)。
最好和最干净的方法是在您的方法中保留一个 CancellationToken
参数,该参数可以以有意义的方式取消并使令牌成为可选的,因此您只能在有请求的情况下传递参数或者可以取消的情况
public Task<Result> ProcessSomething(string param1, CancellationToken cancellationToken = default)
{
}