问题
In all examples that i've seen of IHttpContextAccessor
injection, it is set as a Singleton.
Examples:
How to add IHttpContextAccessor in the Startup class in the DI in ASP.NET Core 1.0? Injecting IHttpContextAccessor into ApplicationDbContext ASP.NET Core 1.0 .NET Core IHttpContextAccessor issue
I find it kinda weird, since HttpContext
really looks like something that maps to requests. Wouldn't AddScoped
be more appropriate in this case?
Is Singleton really the recomended way? Am I not seeeing something?
回答1:
Is Singleton really the recomended way?
Yes
According to comments associated with an issue raised on GitHub
https://github.com/aspnet/Hosting/issues/793#issuecomment-224828588
In that sample, you are registering it as a singleton. Shouldn't it be a scoped instance?
It's fine being a singleton because the backing store is async local.
Which got a later reply
https://github.com/aspnet/Hosting/issues/793#issuecomment-224924030
Actually if you register it as a Transient on .NET Core then it doesn't work properly since the implementation for .NET Core is using a AsyncLocal which relies upon the instance variable to track the thread local storage slot. So it has to be registered as a singleton on .NET Core.
来源:https://stackoverflow.com/questions/46330007/why-should-i-inject-ihttpcontextaccessor-as-a-singleton