我正在研究 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)ValueStore
在Invoke
中间件方法:
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/