Microsoft.AspNet.Http.HttpContext中ApplicationServices和RequestServices之间的区别是什么?

时间:2014-11-25 09:01:35

标签: asp.net-core

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

编辑#1: 例如,在Startup类中:

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
}

如果我没有使用app.UseRequestServices()方法拨打Configure(IApplicationBuilder app),我可以SystemClient获取Context.ApplicationServices.GetService(typeof(SystemClient))个实例,但这不是基于请求的,它似乎是单身和Context.RequestServices为空。一旦我这样打app.UseRequestServices()

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

Context.RequestServices不为空,我可以通过SystemClient获取Context.RequestServices.GetService(typeof(SystemClient))实例,并且实例是按请求进行的。

1 个答案:

答案 0 :(得分:12)

ApplicationServices适用于您应用的生命周期,而RequestServices的范围限定为特定请求(HttpContext)。此外,RequestServices可以为null。一个特殊的RequestContainer中间件初始化RequestServices

app.UseRequestServices()将使用ConfigureServices的结果作为RequestServices

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

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