gpt4 book ai didi

c# - 为什么 services.AddDbContext() 使 dbContext 成为 Scoped 服务?不应该是单例服务吗?

转载 作者:行者123 更新时间:2023-12-05 09:13:40 26 4
gpt4 key购买 nike

我正在使用 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>();
}
};

这里是错误:

asp.net core Cannot consume scoped service from singleton

在线:

 var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>(); 

我的理解是 DBContext 应该用作 Singleton 服务,IUserService 也是如此。但似乎 DBContext 被视为 Scoped Service。

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

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

here

最佳答案

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

Scoped 很有意义,因为它允许您在服务之间传递 DB 对象并在所有服务中获得相同的 DbContext,因此您可以在一个服务中查询实体并在另一个服务中保存更改。

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

关于c# - 为什么 services.AddDbContext<dbContext>() 使 dbContext 成为 Scoped 服务?不应该是单例服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55722087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com