【发布时间】:2022-06-28 16:34:50
【问题描述】:
有没有办法在 asp.net core 中将服务注册为 Scoped 以请求不在当前请求范围内?
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IMyService, MyService>();
}
注册服务在请求范围内可用,但只要我创建新的子范围:
var service1 = serviceProvider.GetService<IMyService>();
var scope = serviceProvider.CreateScope();
var service2 = scope.ServiceProvider.GetService<IMyService>();
Service1 和 service2 是 2 个实例。即使子范围是在同一个请求中创建的。有没有办法将服务注册到请求范围,以便从同一请求范围创建的所有子范围都具有相同的一个实例?
【问题讨论】:
-
您可以通过始终在构造函数上移动服务接口来解决此问题,并注意每个传递的对象都必须定义为 ServiceCollection 中的范围,因此只需从构造函数获取实例。始终使用构造函数注入它会处理这类问题。
-
最后我有一个问题要更清楚,如果我们需要相同的范围,为什么我们需要使用 CreateScope() 方法,对吗?所以这个方法总是创建新的范围而不是内部范围。更多细节:docs.microsoft.com/en-us/dotnet/api/…
-
@MustafaSalihASLIM 想象一下,您有租户对象,您想在请求开始时将其设置在中间件中的某个位置。它应该是请求范围,而不是当前容器范围。因此,如果您在代码中明确创建新范围,则此新范围仍然是同一请求的一部分,因此您应该有权访问该请求的租户。在当前的 asp.net 核心配置中,一旦您创建新范围,您就会失去您的租户,即使它仍然是同一请求的一部分。
标签: c# asp.net-core dependency-injection