vin*_*gde 5 .net-core asp.net-core
我正在阅读有关.Net Core 中的 DI 的 MS 文档。
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2
我越过这条线
“警告
在中间件中使用作用域服务时,将该服务注入到 Invoke 或 InvokeAsync 方法中。不要通过构造函数注入进行注入,因为它会强制服务表现得像单例。”
谁来解释一下这是什么意思?
然后,这里投票最多的答案之一使用构造函数 DI 注入来实现范围服务。 AddTransient、AddScoped 和 AddSingleton 服务有何区别?
这记录在 ASP.NET Core 中间件:每个请求依赖项中。
由于中间件是在应用程序启动时构建的,而不是按请求构建的,因此中间件构造函数使用的作用域生命周期服务不会在每个请求期间与其他依赖项注入类型共享。如果必须在中间件和其他类型之间共享范围服务,请将这些服务添加到 Invoke 方法的签名中。Invoke 方法可以接受由 DI 填充的附加参数:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
// IMyScopedService is injected into Invoke
public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
{
svc.MyProperty = 1000;
await _next(httpContext);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一件非常重要的事情。您的中间件类仅实例化一次,即其构造函数仅运行一次。如果您有一个生命周期为作用域或瞬态的依赖项,那么它的生命周期就较短。如果您通过构造函数需要此类依赖项,则您的中间件依赖于生命周期较短的服务。DI 容器可以在请求完成后处置该服务,从而使您的中间件留下不再工作的服务。
通过在运行时在 Invoke/InvokeAsync 函数中请求它,您可以使用瞬态和范围依赖项。构造函数中可能需要单例,因为它们与中间件具有相同的生命周期。
| 归档时间: |
|
| 查看次数: |
2701 次 |
| 最近记录: |