Выбор ответа Middle ASP.NET Core спрашивают часто обновлено
Scoped внутри Singleton
Вопрос
Singleton-сервис принимает в конструкторе AppDbContext (Scoped). Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В Development исключение проверки scope, иначе DbContext станет общим для всех запросов. Это captive dependency: короткоживущая зависимость захвачена долгоживущим объектом.
Варианты ответа
- В Development исключение проверки scope, иначе DbContext станет общим для всех запросовправильный ответ
- Всё корректно: контейнер создаст новый DbContext на каждый вызов метода синглтона
- DbContext автоматически станет Singleton, и это безопасно благодаря пулу соединений
- Ошибка компиляции: компилятор не даст внедрить Scoped-сервис в Singleton
Разбор
Это captive dependency: короткоживущая зависимость захвачена долгоживущим объектом. Один DbContext на всё приложение будет использоваться параллельными запросами, а он не потокобезопасен, и его трекер изменений бесконечно растёт. В Development включена ValidateScopes, и контейнер бросит InvalidOperationException. Правильно: внедрить IServiceScopeFactory и создавать scope на операцию, или IDbContextFactory<T>. Компилятор о временах жизни ничего не знает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.