我正在阅读有关.Net Core 中的 DI 的 MS 文档。
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.2
我越过这条线
"Warning
在中间件中使用作用域服务时,将该服务注入到
Invoke 或 InvokeAsync 方法。不要通过构造函数注入
注入,因为它强制服务表现得像单例。”
谁来解释一下这是什么意思?
然后,这里投票最多的答案之一使用构造函数 DI 注入来实现范围服务。AddTransient、AddScoped 和 AddSingleton 服务有何区别? https://stackoverflow.com/questions/38138100/addtransient-addscoped-and-addsingleton-services-differences
这在 ASP.NET Core 中间件中有记录:每个请求的依赖关系 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-2.2#per-request-dependencies.
由于中间件是在应用程序启动时构建的,而不是按请求构建的,因此中间件构造函数使用的作用域生命周期服务不会在每个请求期间与其他依赖项注入类型共享。如果必须在中间件和其他类型之间共享范围服务,请将这些服务添加到 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)