Внедрение сервисов в MainLayout.cs в серверном Blazor

Как следует из названия, я пытаюсь внедрить службу на страницу MainLayout на стороне сервера Blazor. Сервис представляет собой ApplicationDbContext, который вводится следующим образом:

@inject ApplicationDbContext context

и регистрируемся вот так:

services.AddDbContext<ApplicationDbContext>(options =>
    options.UseNpgsql(
        Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);

Однако я получаю System.ObjectDisposedException исключение.

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен в результате внедрения зависимостей, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose () в контексте или заключаете контекст в оператор using. Если вы используете внедрение зависимостей, вы должны позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста. Имя объекта: 'ApplicationDbContext'. '

Первая загрузка страницы в порядке, но после этого возникает эта ошибка. Это также происходит с любыми компонентами, вложенными в страницу макета, но, похоже, не происходит на самих страницах.


person LuvForAirplanes    schedule 07.12.2019    source источник


Ответы (1)


Этим я решил проблему.

  1. Зарегистрировали DbContext
services.AddDbContext<ApplicationDbContext>(options =>
    options.UseNpgsql(
        Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);
  1. Вставил DbContext в вложенный компонент бритвы, как это
@inherits OwningComponentBase<ApplicationDbContext>

вместо того

@inject ApplicationDbContext context
  1. Выполнял операции с базой данных, и это волшебным образом сработало.

Надеюсь, это кому-нибудь поможет. Билет, в котором обсуждается эта проблема, - # 10448 в репозиторий AspNetCore.

person LuvForAirplanes    schedule 07.12.2019