为什么services.AddDbContext <dbContext>()使dbContext成为作用域服务?应该不是Singleton服务?

Fra*_*nva 0 c# entity-framework entity-framework-core asp.net-core

我正在将ASP.NET Core 2.2与Pomelo.EntityFramework.MySql一起使用。

这是我的代码:

 services.AddDbContext<dbContext>(options => options.UseMySQL(appConfigsSection["DbConnectionString"]));
 services.AddSingleton<IUserService, UserService>();


 services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x=> {
                x.Events = new JwtBearerEvents
                {
                    OnTokenValidated = context =>
                    {
                        var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();       
                    }
                };
Run Code Online (Sandbox Code Playgroud)

这是错误:

asp.net核心无法使用单例的作用域服务

在:

 var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>(); 
Run Code Online (Sandbox Code Playgroud)

我的理解是DBContext应该用作Singleton服务,IUserService也应该用作。但是似乎DBContext被视为范围服务。

通过将IUserService切换回作用域服务,可以轻松修复它。但是我想知道为什么不能将DBContext用作单一服务吗?

我认为DBContext应该用作Singleton服务,对吗?

这里

juu*_*nas 5

DbContext不应用作单例,因为它持有一个连接对象,该对象不能同时被多个线程使用。如果两个请求尝试同时使用它,则会遇到错误。如果您的服务取决于上下文,则该服务不能是单例。

范围是有道理的,因为它允许您在服务之间传递数据库对象并在所有服务中获得相同的DbContext,以便您可以查询一个服务中的实体并将更改保存到另一个服务中。

例如,如果需要在两个服务中并行运行查询,可以将其更改为瞬态。服务生存期是AddDbContext()上的一个参数。