【问题标题】:Service becomes null after injecting in DbContext注入 DbContext 后服务变为空
【发布时间】: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 肯定需要是 ScopedTransient,它永远不可能是 Singleton...想知道你是怎么让它这样工作的。
  • 谢谢。我尝试了 Transient,现在它可以工作了,但不能与 Scoped 一起工作。
  • 不适用于 Scoped... 这很奇怪。能不能展示一下Startup.ConfigureServices的方法?
  • CurrentUserService 如果用户没有在构造函数中被解析,则作为单例工作,而是在访问属性时被解析。
  • @Llama 从本质上讲,它为您提供伪装成单例的范围服务。这样做没有意义,而且可能无法通过 .NET Core 默认 DI。

标签: c# entity-framework asp.net-core


【解决方案1】:

我的代码中的错误是这样的:

public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
    this.UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
public string UserId { get; private set; }

我按照@Llama 指出的那样更改了它。

 private readonly IHttpContextAccessor _httpContextAccessor;
    public CurrentUserService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public string UserId => _httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);

无论服务是作用域还是临时服务,在我更正 CurrentUserService 中的代码之前,该服务在 DbContext 中都是空的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多