Почему services.AddDbContext <dbContext>() делает dbContext сервисом Scoped? Не должен ли он быть сервисом Singleton? - PullRequest
0 голосов
/ 17 апреля 2019

Я использую 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 Невозможно использовать сервис с областью действия из синглтона

в строке:

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

Насколько я понимаю, DBContext должен использоваться в качестве службы Singleton, поэтомуIUserService.Но кажется, что DBContext рассматривается как служба Scoped.

Я легко могу это исправить, переключив свой IUserService обратно на службу Scoped.Но мне интересно, почему я не могу использовать DBContext в качестве единой службы?

Я думаю, что DBContext следует использовать в качестве службы Singleton, правильно ??

здесь

1 Ответ

5 голосов
/ 17 апреля 2019

DbContext не должен использоваться в качестве одиночного, потому что он содержит объект подключения, который не может использоваться несколькими потоками одновременно.Вы столкнетесь с ошибками, если два запроса попытаются использовать его одновременно.Если ваш сервис зависит от контекста, сервис не может быть одноэлементным.

Имеет смысл Scoped, поскольку он позволяет вам передавать объекты БД между сервисами и получать один и тот же DbContext во всех из них, чтобы вы могли запрашивать объектыв одном сервисе и сохраните изменения в другом.

Вы можете изменить его на переходный, если вам нужно, например, параллельно выполнять запросы в двух сервисах.Срок службы - это параметр в AddDbContext ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...