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

Ric*_*cky 18 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
}
Run Code Online (Sandbox Code Playgroud)

如果我不叫app.UseRequestServices()Configure(IApplicationBuilder app)方法,我可以SystemClient通过例如Context.ApplicationServices.GetService(typeof(SystemClient)),但不是每个请求的基础,似乎单和Context.RequestServices为空.一旦我这样打电话app.UseRequestServices():

public void Configure(IApplicationBuilder app)
{
    app.UseRequestServices();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Context.RequestServices不是null,我可以获取SystemClient实例,Context.RequestServices.GetService(typeof(SystemClient))实例是按请求.

Hao*_*ung 13

ApplicationServices是应用程序的生命周期,同时RequestServices作用于特定请求(HttpContext).此外,RequestServices可以为null.一个特殊的RequestContainer中间件初始化RequestServices:

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

app.UseServices() 并且它的重载允许您指定/修改请求服务

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