【问题标题】:What's the difference between ApplicationServices and RequestServices in Microsoft.AspNet.Http.HttpContext?Microsoft.AspNet.Http.HttpContext 中的 ApplicationServices 和 RequestServices 有什么区别?
【发布时间】:2015-12-11 20:57:54
【问题描述】:

Startup 类中,我可以在ConfigureServices 方法中添加服务。当我想获得某个服务时,HttpContext 实例中有两个属性,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
}

如果我不在Configure(IApplicationBuilder app) 方法中调用app.UseRequestServices(),我可以通过Context.ApplicationServices.GetService(typeof(SystemClient)) 获取SystemClient 实例,但这不是基于每个请求的,它似乎是单例并且Context.RequestServices 为空。一旦我像这样打电话给app.UseRequestServices()

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

Context.RequestServices 不为空,我可以通过Context.RequestServices.GetService(typeof(SystemClient)) 获取SystemClient 实例,并且该实例是基于每个请求的。

【问题讨论】:

  • 注意:ApplicationServices 不再是HttpContext 的一部分。

标签: asp.net-core


【解决方案1】:

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

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

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

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

【讨论】:

  • 您对应用程序的生命周期意味着什么?范围服务呢?他们也是一辈子的吗?没有任何意义。我也问了here
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 2011-12-12
  • 2010-09-16
  • 2012-03-14
  • 2012-02-06
  • 2011-02-25
  • 2011-11-22
  • 2015-03-26
相关资源
最近更新 更多