我有一个简单的服务,其中包含List<Foo>
。在 Startup.cs 中,我使用services.addScoped<Foo, Foo>()
method.
我将服务实例注入两个不同的位置(控制器和中间件),对于单个请求,我希望获得相同的实例。然而,这似乎并没有发生。
即使我将 Foo 添加到控制器操作中的列表中,中间件中的 Foo 列表始终为空。为什么是这样?
我尝试将服务注册更改为单例,使用AddSingleton()
它按预期工作。但是,这必须限于当前请求。非常感谢任何帮助或想法!
FooService.cs
public class FooService
{
public List<Foo> Foos = new List<Foo>();
}
启动.cs
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddScoped<FooService, FooService>();
}
[下面是我注入服务的两个地方,导致两个不同的实例]
MyController.cs
public class MyController : Controller
{
public MyController(FooService fooService)
{
this.fooService = fooService;
}
[HttpPost]
public void TestAddFoo()
{
//add foo to List
this.fooService.Foos.Add(new Foo());
}
}
FooMiddleware.cs
public AppMessageMiddleware(RequestDelegate next, IServiceProvider serviceProvider)
{
this.next = next;
this.serviceProvider = serviceProvider;
}
public async Task Invoke(HttpContext context)
{
context.Response.OnStarting(() =>
{
var fooService = this.serviceProvider.GetService(typeof(FooService)) as FooService;
var fooCount = fooService.Foos.Count; // always equals zero
return Task.CompletedTask;
});
await this.next(context);
}