【问题标题】:Asp.net core service per request scope in child scopes子范围中每个请求范围的 Asp.net 核心服务
【发布时间】: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


【解决方案1】:

.Net Core 中没有 RequestScope 特性,相反 .Net Framework。我们使用“Scoped”,因为 .Net Core 在第一个调用的中间件开始时创建范围,内部服务通过构造函数注入获得相同的对象实例。例如;如果您收到一个 API 请求,即“作用域请求实例”,它将对内部作用域进行所有实例,但是您不能手动使用 CreateScope() 方法,因为我提到了为什么不能这样做。

您对创建内部范围感到困惑,但 .Net Core 为每个 API 请求创建范围。

示例:https://stackoverflow.com/a/38139500/7575384

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2013-08-26
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多