在Startup
类中,我可以ConfigureServices
方法中添加服务。当我想获得某个服务时,HttpContext 实例中有 2 个属性,ApplicationServices
和 RequestServices
。我想知道它们之间的区别以及如何正确使用它们。
编辑#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,因为它们本身依赖于请求范围的服务。