Какая разница между ApplicationServices и RequestServices в Microsoft.AspNet.Http.HttpContext?
В классе 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))
, но он не для каждого запроса, кажется, singleton и Context.RequestServices
равно null. Как только я назову app.UseRequestServices()
следующим образом:
public void Configure(IApplicationBuilder app)
{
app.UseRequestServices();
// ...
}
Context.RequestServices
не является нулевым, и я могу получить экземпляр SystemClient
на Context.RequestServices.GetService(typeof(SystemClient))
, а экземпляр - на основе запроса.
Ответы
Ответ 1
ApplicationServices
относятся к сроку действия вашего приложения, а RequestServices
привязаны к определенному запросу (HttpContext
). Кроме того, RequestServices
может быть нулевым. Специальным промежуточным программным обеспечением RequestContainer является то, что инициализирует RequestServices
:
app.UseRequestServices()
будет использовать результат ConfigureServices
как RequestServices
app.UseServices()
и его перегрузки позволяют указать/изменить службы запросов
Также, если вы используете маршрутизацию/или любое промежуточное программное обеспечение безопасности, они автоматически гарантируют, что RequestServices также будут заполнены, поскольку они полагаются на службы с ограниченным запросом.