Блейзор, время жизни объекта и внедрение зависимостей

#c# #entity-framework #dependency-injection #blazor #lifetime

#c# #entity-framework #внедрение зависимостей #блейзор #время жизни

Вопрос:

Я работаю над своим первым проектом Blazor, и я столкнулся с проблемой времени жизни объекта.

Точная проблема заключается в том, что мой EF DbContext никогда не утилизируется, поэтому после первого обновления базы данных любое последующее обновление завершается неудачно из-за исключения, сообщающего мне, что объект уже отслеживается контекстом.

Итак, после расследования я обнаружил, что все службы, внедряемые в зависимости, разрешаются при запуске приложения и никогда не удаляются, так же как и DbContext , которые вводятся как UnitOfWork

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

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

РЕДАКТИРОВАТЬ: я должен также добавить, что мой DbContext добавлен в IServiceCollection как Scoped

Комментарии:

1. как именно вы вводите свой DbContext? опубликуйте код. пожалуйста.

2. Услуги. Добавить DbContext<EquipmentsDbContext>(параметры);

Ответ №1:

Blazor не имеет удобных областей запроса, которые есть у сервера.

Вы должны управлять контекстом самостоятельно, вы не можете оставить его (полностью) DI.

На этой странице показано, как либо

  • управляйте контекстом в области метода с помощью using( ... )
  • или связать его со временем жизни компонента с @implements IDisposable

В обоих случаях вы можете использовать DbContextFactory (стандартная проблема в EF5), чтобы создать его, используя зарегистрированные параметры конфигурации.

Поэтому никогда не вводите сам DbContext.

Комментарии:

1. Я впервые создал шаблон Factory. и это работает как шарм!