Ef core как получить iwebhostenvironment в модели

от admin

Внедрить IWebHostingEnvironment в переопределенный метод

Используя ASP.NET Core 5.0, я пытаюсь получить доступ к IWebHostEnvironment в классе модели EF Core 5.0. Как я могу получить доступ к проверке истинности IsDevelopment из окружения?

Я вызываю класс ниже из моих контроллеров следующим образом:

Мне действительно нужно также раскрутить IWebHostEnvironment в каждом контроллере, который вызывает этот класс EF, чтобы указать правильный конструктор?

Я видел несколько угроз о DI, но, честно говоря, у них есть запутанные решения, которые я не могу понять.

Ef core как получить iwebhostenvironment в модели

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Для взаимодействия со средой, в которой запущено приложение, применяются объекты, реализующие интерфейс IHostingEnvironment . Этот интерфейс предлагает ряд свойств, с помощью которых мы можем получить информацию об окружении:

ApplicationName : возвращает имя приложения

EnvironmentName : возвращает описание среды, в которой хостируется приложение

ContentRootPath : возвращает путь к корневой папке приложения

WebRootPath : возвращает путь к папке, в которой хранится статический контент приложения, как правило, это папка wwwroot

ContentRootFileProvider : возвращает реализацию интерфейса Microsoft.AspNetCore.FileProviders.IFileProvider , которая может использоваться для чтения файлов из папки ContentRootPath

WebRootFileProvider : возвращает реализацию интерфейса Microsoft.AspNetCore.FileProviders.IFileProvider , которая может использоваться для чтения файлов из папки WebRootPath

При разработке мы можем использовать эти свойства. Но наиболее часто при разработке придется сталкиваться со свойством EnvironmentName . По умолчанию имеются три варианта значений для этого свойства: Development, Staging и Production. В проекте это свойство задается через установку переменной среды ASPNETCORE_ENVIRONMENT . Ее текущее значение можно посмотреть в свойствах проекта на вкладке Debug:

Здесь же также можно изменить значение этой переменной.

Кроме того, в проекте в папке Properties есть файл launchSettings.json , который также содержит описания переменных сред:

Здесь можно увидеть, что переменная «ASPNETCORE_ENVIRONMENT» встречается два раза — для запуска через IISExpress и для запуска через Kestrel. В обоих случаях она имеет значение Development. Здесь мы также можем поменять значение этой переменной. Причем файл launchSettings.json переопределяет настройки проекта. Например, если в launchSettings.json мы определим «ASPNETCORE_ENVIRONMENT»: «Production» , то имя среды нашего проекта будет «Production», хотя в настройках проекта может стоять «Development».

Для определения значения этой переменной для интерфейса IWebHostEnvironment определены специальные методы расширения:

IsEnvironment(string envName) : возвращает true , если имя среды равно значению параметра envName

IsDevelopment() : возвращает true , если имя среды — Development

IsStaging() : возвращает true , если имя среды — Staging

IsProduction() : возвращает true , если имя среды — Production

Например, при создании нового проекта в методе Configure() класса Startup можно найти следующие строки:

Таким образом, если имя среды имеет значение «Development», то есть приложение находится в состоянии разработки, то при ошибке разработчик увидит детальное описание ошибки. Если же приложение развернуто на хостинге и соответственно имеет другое имя хостирующей среды, то простой пользователь при ошибке ничего не увидит. Таким образом, в зависимости от стадии, на которой находится проект, мы можем скрывать или задействовать часть функционала приложения.

Читать:
Как сделать водяное охлаждение

Определение своих состояний среды

Хотя по умолчанию среда может принимать три состояния: Development, Staging, Production, но мы можем при желании вводить новые значения. Например, нам надо отслеживать какие-то дополнительные состояния. К примеру, изменим в файле launchSettings.json значение «ASPNETCORE_ENVIRONMENT» на «Test» (значение может быть произвольное):

Далее мы можем использовать это состояния для выполнения различных действий. Например, используем состояние «Test» в классе Startup:

Inject IWebHostingEnvironment into overridden method

Using ASP.NET Core 5.0, I’m attempting to access IWebHostEnvironment in an EF Core 5.0 model class. How can I get access to the check if IsDevelopment is true from the environment?

I’m calling the below class from my Controllers like so:

Do I really need to also spin up IWebHostEnvironment in each controller that calls this EF class to target the correct constructor?

I’ve seen a few threats about DI, but to be honest, they have convoluted solutions that I can’t quite grok.

Ef core как получить iwebhostenvironment в модели

Ef core как получить iwebhostenvironment в модели

Environment Name in ASP.NET Core

How to get the Development/Staging/production Hosting Environment in ConfigureServices

How do I get the Development/Staging/production Hosting Environment in the ConfigureServices method in Startup?

The ConfigureServices method only takes a single IServiceCollection parameter.

ArunPratap

Muhammad Rehan Saeed

15 Answers 15

You can easily access it in ConfigureServices, just persist it to a property during Startup method which is called first and gets it passed in, then you can access the property from ConfigureServices.

Joe Audette

Set an environment variable called ASPNETCORE_ENVIRONMENT with the name of the environment (e.g. Production ). Then do one of two things:

  • Inject IHostingEnvironment into Startup.cs , then use that ( env here) to check: env.IsEnvironment(«Production») . Do not check using env.EnvironmentName == «Production» !
  • Use either separate Startup classes or individual Configure / ConfigureServices functions. If a class or the functions match these formats, they will be used instead of the standard options on that environment.
    • Startup () (entire class) || example: StartupProduction()
    • Configure () || example: ConfigureProduction()
    • Configure Services() || example: ConfigureProductionServices()

    Full explanation

    The .NET Core docs describe how to accomplish this. Use an environment variable called ASPNETCORE_ENVIRONMENT that’s set to the environment you want, then you have two choices.

Похожие статьи