Библиотека Prism Dryioc CreateScope — не удается получить доступ к удаленному объекту

#scope #prism #dbcontext #idisposable #dryioc

#область #prism #dbcontext #idisposable #dryioc

Вопрос:

У меня есть приложение Xamarin Forms с prism Dryioc 7.1, и я столкнулся со следующей проблемой: вторая операция началась в этом контексте до завершения предыдущей операции.

Итак, я последовал за этим сообщением #https://www.pmichaels.net/tag/a-second-operation-started-on-this-context-before-a-previous-operation-completed/

Это устранило мою проблему, пока я не добавил страницы с вкладками в приложение XF, поскольку все страницы с вкладками инициализируются одновременно, у меня есть параллельные классы служб, обращающиеся к моему DbContext, на которых я предполагал, что они были разными экземплярами, по крайней мере, когда они создаются, у них разные идентификаторы GUID, однако кажется, что каждыйкогда мой DbContext удален, удалите все экземпляры DbContext, я создал простое приложение с вкладками в XF с помощью Prism, которое повторяет мою проблему, когда я использую свой DbContext на веб-сервере, я создаю области видимости, однако с помощью prism я, похоже, не могу этого сделать, потому что, если я попытаюсь внедрить IContainerRegistry и IContainerProviderв моем классе обслуживания просто не работает мое приложение.

Я искал везде и не могу найти способ создать область на странице сервиса

Мой интерфейс IGenerateDbContext имеет только один метод

 public IApplicationDbContext GenerateNewContext()
        {
            IApplicationDbContext dbContext = new ApplicationDbContext(_sqlite);
            return dbContext;
        }
 

Мое хранилище данных обращается к DbContext через IGenerateDbContext

 using (IApplicationDbContext myDbContext = _generateDbContext.GenerateNewContext())
                {
                    ....
                    removed for simplicity
                }
 

Полное приложение доступно здесь
https://github.com/silvajnr/PrismTabbedDbContext

Я читал, что prism создает DbContext для ViewModel, следует просто синхронизировать DBConetx с блокировками мьютекса

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

Ответ №1:

Спасибо за сообщение в блоге: Xamarin: начало работы с Prism 7 https://codesandchips.blog/2018/05/31/xamarin-getting-started-with-prism-7 /

Показал мне, как вручную разрешить службы.

 var _appContainer = (App.Current as PrismApplication).Container.GetContainer();

using (var scope = _appContainer.OpenScope())
                    {
                        IApplicationDbContext myDbContext = scope.Resolve<IGenerateDbContext>().GenerateNewContext();
...
}