Microsoft.AspNet.Http.HttpContext中的ApplicationServices和RequestServices有什么区别?



Startup类中,我可以ConfigureServices方法中添加服务。当我想获得某个服务时,HttpContext 实例中有 2 个属性,ApplicationServicesRequestServices 。我想知道它们之间的区别以及如何正确使用它们。

编辑#1:例如,在启动类中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ICache, InProcessCache>();  // Line 1
    services.AddSingleton<ISystemClientResolver>(SystemClientResolver.CreateInstance); // Line 2
    services.AddScoped<SystemClient>(); // Line 3
    services.AddRvcBusiness(); // Line 4
    services.AddMvc(); // Line 5
}

如果我不Configure(IApplicationBuilder app)方法中调用app.UseRequestServices(),我可以通过Context.ApplicationServices.GetService(typeof(SystemClient))获取SystemClient实例,但它不是基于每个请求的,它似乎是单例的,Context.RequestServices是空的。一旦我这样打电话给app.UseRequestServices()

public void Configure(IApplicationBuilder app)
{
    app.UseRequestServices();
    // ...
}

Context.RequestServices 不为 null,我可以通过Context.RequestServices.GetService(typeof(SystemClient))获取SystemClient实例,并且该实例是基于每个请求的。

ApplicationServices适用于

应用的生存期,而RequestServices的作用域为特定请求(HttpContext)。 此外,RequestServices可以为空。 一个特殊的 RequestContainer 中间件初始化RequestServices

app.UseRequestServices()将使用ConfigureServices的结果作为请求服务

app.UseServices()及其重载允许您指定/修改请求服务

此外,如果您使用路由/或任何安全身份验证中间件,它们将自动确保也填充 RequestServices,因为它们本身依赖于请求范围的服务。

最新更新