在Startup
课程中,我可以使用ConfigureServices
方法添加服务。当我想获得某项服务时,HttpContext实例中有2个属性,ApplicationServices
和RequestServices
。我想知道它们之间的区别以及如何正确使用它们。
编辑#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))
实例,并且实例是按请求进行的。
答案 0 :(得分:12)
ApplicationServices
适用于您应用的生命周期,而RequestServices
的范围限定为特定请求(HttpContext
)。此外,RequestServices
可以为null。一个特殊的RequestContainer中间件初始化RequestServices
:
app.UseRequestServices()
将使用ConfigureServices
的结果作为RequestServices
app.UseServices()
及其重载允许您指定/修改请求服务
此外,如果您使用路由/或任何安全身份验证中间件,他们将自动确保填充RequestServices,因为它们本身依赖于请求范围的服务。