Почему Вы Всегда Должны Разрабатывать в Среде "Development" в ASP.NET
В .NET Core/5+ появилось понятие «среды». Среды используются для описания различных этапов на пути к производственному коду. Например, локальная разработка, тестирование, staging, production и т.д. У вас может быть неограниченное количество сред, и нет никаких правил о том, как вы их называете. Или есть?
Недавно я помогал коллеге решить проблему, которая возникала только в одной среде (первом этапе CD в Azure). В других средах проблем не было. Возникала ошибка “Cannot Consume Scoped Service From Singleton“ (Невозможно Получить Scoped Сервис из Синглтон Сервиса). В общем-то решить её было довольно просто, но почему же она возникала только в этой среде?
«Известные» среды в .NET
Как сказано выше, правил именования сред в .NET нет. Однако, существуют 3 «предустановленные» среды: Development, Staging и Production. Мы даже можем использовать в коде специальные методы:
env.IsDevelopment();На самом деле, под капотом
env.IsProduction();
//Проверяет, называется ли текущая среда Test1
env.IsEnvironment("Test1");
IsDevelopment просто вызывает IsEnvironment(“Development”). Вроде всё логично. Возвращаясь к проекту. Там среда разработки называлась “Local”, а первый этап CD в Azure назывался “Development”. Таков был корпоративный стандарт, вроде никаких проблем возникать не должно, просто используем
env.IsEnvironment("Local");
вместоenv.IsDevelopment();Проверки на IsDevelopment во фреймворке
А что там в коде собственно .NET, написанном Microsoft? В принципе уже должно быть очевидно: проблема в том, что Microsoft ожидает, что среда вашей локальной разработки будет называться именно «Development». Не «Local», не «Dev», не «DevMachine», а «Development». Даже когда мы создаём новое веб-приложение ASP.NET Core, мы получаем шаблонный код, который выглядит так:
if (env.IsDevelopment())Поэтому я полез в исходный код .NET (как же хорошо иметь исходники!), и нашёл это:
{
app.UseDeveloperExceptionPage();
}
bool isDevelopment = context.HostingEnvironment.IsDevelopment();Установка
options.ValidateScopes = isDevelopment;
options.ValidateOnBuild = isDevelopment;
ValidateScopes в true фактически запускает проверку захвата сервисов и выдаёт упомянутое выше исключение «Cannot use scoped service from singleton». Поскольку среда разработки называлась «Local», а среда CD - «Development», мы видели исключение только в CD.Очевидно, что называть CD среду как «Development», скорее всего, неправильно. Но думаю, что есть масса разработчиков, называющих свою локальную среду разработки как угодно, даже не осознавая, что глубоко в коде .NET есть проверка, что среда называется именно «Development» и никак иначе.
Источник: https://dotnetcoretutorials.com/2021/08/06/why-you-should-always-use-asp-net-development-environment-for-local-development/