Как использовать Autofac для внедрения одного и того же экземпляра DbContext для обработки HTTP-запроса без проблем с параллелизмом? - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над приложением ASP.net Web API с Autofac и Entity Framework.

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

Я использую Autofac для внедрения Entity Framework DbContext в мои различные вспомогательные классы.Это становится проблематичным, потому что если я использую сущности, запрошенные из DbContext в двух разных вспомогательных классах, я получаю ошибку, когда Entity Framework пытается произвести запрос.

Ошибка говорит о том, что Entity Framework не может создать запрос с сущностями из двухразные экземпляры DbContext.

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

Как настроить Autofac таким образом, чтобы при поступлении запроса в мое приложение все мои вспомогательные классы API получалитот же экземпляр DbContext, но у меня нет проблем параллелизма по нескольким запросам?

1 Ответ

0 голосов
/ 02 апреля 2019

Альтернатива фильтру действий, рекомендованному в документации Autofac (https://autofaccn.readthedocs.io/en/latest/faq/per-request-scope.html#no-per-request-filter-dependencies-in-web-api), см. «Нет зависимостей фильтра для каждого запроса в Web API» и вручную перейдите к DependencyResolver для других:

Вы можете взглянуть на единицу работы Medhime DbContextScope. (https://www.nuget.org/packages/EntityFramework.DbContextScope/) скомпилировано как для EF6, так и для EF Core.

Внедренные зависимости для ваших классов становятся DbContextScopeFactory для верхнего уровня и AmbientDbContextLocator для ваших служб. Они не «ломаются» из-за ограничения веб-API на время действия запроса. ContextScopeFactory будет инициализирован один раз и предоставит DbContext, в то время как локаторы получат этот единственный экземпляр.

Возможно, стоит взглянуть, не получается ли управлять контекстными ссылками в разных сервисах и действиями API.

...