【发布时间】:2021-10-20 04:26:01
【问题描述】:
我有一个完美运行的服务 CurrenUserServce。但是当我在 DbContext 中注入它时,突然 UserId 在我的控制器中总是为空。
public class CurrentUserService : ICurrentUserService
{
public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
this.UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
public string UserId { get; private set; }
}
我的 DbContext 看起来像这样
public class AppDbContext:IdentityDbContext<AppUser>,IAppDbContext
{
private readonly ICurrentUserService _currentUserService;
public AppDbContext(DbContextOptions<AppDbContext> options, ICurrentUserService currentUserService):base(options)
{
_currentUserService = currentUserService;
}
DbContext 注册为作用域,服务注册为单例,我也在服务中尝试了作用域和瞬态但没有工作。
【问题讨论】:
-
CurrentUserService肯定需要是Scoped或Transient,它永远不可能是Singleton...想知道你是怎么让它这样工作的。 -
谢谢。我尝试了 Transient,现在它可以工作了,但不能与 Scoped 一起工作。
-
不适用于 Scoped... 这很奇怪。能不能展示一下
Startup.ConfigureServices的方法? -
CurrentUserService 如果用户没有在构造函数中被解析,则作为单例工作,而是在访问属性时被解析。
-
@Llama 从本质上讲,它为您提供伪装成单例的范围服务。这样做没有意义,而且可能无法通过 .NET Core 默认 DI。
标签: c# entity-framework asp.net-core