ASP.NET 5和内置DI容器的每个请求作用域

本文关键字:请求 作用域 NET 内置 DI ASP | 更新日期: 2023-09-27 18:21:23

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

我使用的代码:

services.AddScoped<ValueStore>();

在我的中间件中,我抓住了价值:

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

完整代码在这里可用

我的问题是:虽然我希望在每次请求时都续订此服务,但这并没有发生,而且它的行为就像注册为AddSingleton()一样。

我做错什么了吗?

ASP.NET 5和内置DI容器的每个请求作用域

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

使用HttpContext.RequestServices:

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

或者在中间件的Invoke方法中注入ValueStore

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

我克隆了你的回购,这很有效。