c# - 使用 ASP.NET 5 和内置 DI 容器的每个请求范围

标签 c# asp.net asp.net-core

我正在研究 ASP.NET 5 中的 DI 主题,我遇到了这样一个问题 - 我不明白如何为每个请求创建一个新的服务实例。

我使用代码:

services.AddScoped<ValueStore>();

在我的中间件中,我获取了值:

var someValueStore = app.ApplicationServices.GetService<ValueStore>();

完整代码可用here

我的问题是:虽然我希望在每次请求时更新此服务,但它并没有发生,它的行为就好像它已注册为 AddSingleton()

我做错了什么吗?

最佳答案

app.ApplicationServices不提供请求范围的 IServiceProvider .它将返回 ValueStore 的单例实例。当你使用 GetService<>() .您在这里有两个选择:

使用 HttpContext.RequestServices :

var someValueStore = context.RequestServices.GetService<ValueStore>();

或者注入(inject)ValueStoreInvoke中间件方法:

public async Task Invoke(HttpContext httpContext, ValueStore valueStore)
{
    await httpContext.Response.WriteAsync($"Random value = {valueStore.SomeValue}");
    await _next(httpContext);
}

我克隆了你的代码库,这很有效。

关于c# - 使用 ASP.NET 5 和内置 DI 容器的每个请求范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33612609/

相关文章:

c# - 在另一台机器上注册 COM dll

c# - 如何在 C# 中将 IEnumerable 转换为自定义类型?

c# - 我可以在 Linq to SQL Query 中实例化对象时调用自己的方法吗?

c# - 窗体 : How to Collect All String Values from a ListBox

c# - 如何取消由按下 ButtonColumn 引起的提交事件

c# - 我如何使用 System.Net.NetworkInformation.GatewayIPAddressInformation 类?

c# - ASP.NET 5 MVC 6 和 Entity Framework 7 问题

Angular 7 HttpClient 将请求参数发送到端点的空值

c# - Visual Studio 2013发布失败报 "non-existing"错误

c# - .Net Core 库中的嵌入式资源