【问题标题】:Cannot consume scoped service from singleton, Repository and DBContext无法使用单例、存储库和 DBContext 中的作用域服务
【发布时间】:2022-09-29 19:49:55
【问题描述】:

我有UserRepository,我通过ASP.NET Core 依赖注入机制将DbContext 注入其中,并得到以下异常。

无法从单例 \'DAL.Abstract.IUserRepository\' 使用范围服务 \'DAL.SocialMediaAppDbContext\'。)(验证服务描述符 \'ServiceType: DAL.Abstract.IUserRepository Lifetime: Singleton ImplementationType: DAL.Concrete.UserRepository 时出错\': 不能从单例 \'DAL.Abstract.IUserRepository\' 使用范围服务 \'DAL.SocialMediaAppDbContext\'。)\'

总的来说,我理解这个问题,我必须使 DbContext 单例或 userRepository 范围。但是什么是正确的配置?我应该做 DbContext单身人士?或者我的用户存储库范围?我猜 userRepository 应该保持单例,因为没有必要为每个请求创建 repo 实例,但是如何正确解决这个问题?我的项目是基于 .NET 6 的 WEB API。我想听听一些整体的建议。

这是代码

    services.AddSingleton<IUserRepository, UserRepository>();

 

    services.AddDbContext<SocialMediaAppDbContext>(options => 
    {
        options.UseSqlServer(_config.GetConnectionString(DBCommon.ConnectionString));
    });


public class UserRepository : IUserRepository
{
    private readonly SocialMediaAppDbContext _context;
    
    public UserRepository(SocialMediaAppDbContext context)
    {
        _context = context;
    }
}
  • 永远,永远,永远让 DbContext 成为单例!
  • 好的,所以让 UserRepo 限定范围?
  • 是的,这会奏效。

标签: c# asp.net-core dependency-injection repository-pattern


【解决方案1】:

您应该使 UserRepository 使用 Scoped 生命周期。 一个 DbContext 不能被多个请求共享,所以它不能是一个单例。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2021-04-28
    相关资源
    最近更新 更多