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:
Ef core как получить iwebhostenvironment в модели
Внедрить 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:
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.
16 Answers 16
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.
If you need to test this somewhere in your codebase that doesn’t have easy access to the IHostingEnvironment, another easy way to do it is like this:
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.
Code Murals
This blog is going to illustrate how to implement Entity Framework (EF) Core with SQL Server LocalDB. The Entity Framework Core enables access to data from the database. This allows developers to avoid having to write most of the data access code. And the SQL Server LocalDB works similarly to the SQL SERVER with few features. You can get the LocalDB when you install visual studio or visual studio express. You can find the .mdf and _log.ldf files in the C:/Users/ directory.
Let see how to create a SQL Server LocalDB and implement Entity Framework Core
Step 1:
The first step is to add a connection. In the menu -> click Tools and select Connect to DatabaseIt will display the Add Connection window. Enter (localdb)\mssqllocaldb in the server name textbox. Then in the Select or enter a database, select master and click ok
Now in the server explorer, you can find the master DB containing Tables, Views, Stored Procedures, etc.
Step 2:
This step, going to describe how to create a new database. To create a new database, right-click on the master database in the server explorer and select New Query. It will open the New Query window.In the query window, you can write the query to create a new database like the one below. Click the Execute button to run the query or press Ctrl + Shift + E to run the Query
Also, you can create the database using GUI. For that, In Server Explorer, right-click on the Data Connection and select Create New SQL Server Database. It will open the Create New SQL Server Database window. Enter the server name (localdb)\mssqllocaldb in the server name textbox and enter your new database name and click the ok button to create a database.
For GUI, Right-click on the Table folder in Server Explorer and select Add New Table.
Step 4:
To use the Database in ASP.NET Core, I have to use Microsoft Entity Framework core. The following is a command to install the Entity Framework core packages using Package Manager Console. To get a Package Manager Console click Tools -> NuGet Package Manager -> Package Manager ConsoleThe below one is a screenshot of Solution Explorer. You can find a list of entity framework core packages under the package.
Step 5:
The next step is a DB Model creation. I have created a folder called Models to store the models. Now following command is to create a DBContext. Run this command in Package Manager ConsoleThe following is a screenshot of the solution explorer after executing the Scaffold-DbContext command. Here you can see the SamepleDBContext.cs and MovieTable.cs files under the Models folder.
Step 6:
This step is going to explain how to update the Entity Framework Core. I have added a new column CoProduction to the table MovieTable.The following is a Scaffold-DbContext command to update the Entity Framework Core.
Ef core как получить iwebhostenvironment в модели
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет сведения о среде веб-размещения, в которой выполняется приложение.
Свойства
Возвращает или задает IFileProvider, указывающий на WebRootPath.
Возвращает или задает абсолютный путь к каталогу, содержащему файлы содержимого приложения Web-обслуживаемые.
ASP.NET Web API + Entity Framework + Microsoft SQL Server + Angular. Часть 1
Небольшой курс по созданию простого веб-приложения с помощью технологий ASP.NET Core, фреймворка Entity Framework, СУБД Microsoft SQL Server и фреймворка Angular. Тестировать Web API будем через приложение Postman.
Курс состоит из нескольких частей:
- Создание Web API с помощью ASP.NET Web API и Entity Framework Core.
- Реализация пользовательского интерфейса на Angular.
- Добавление аутентификации в приложение.
- Расширение модели приложения и рассмотрение дополнительных возможностей Entity Framework.
Часть 1. Создание Web API с помощью ASP.NET Web API и Entity Framework Core
В качестве примера будем расматривать уже ставшее классическим — приложение списка дел. Для разработки приложения я буду использовать Visual Studio 2019(в Visual Studio 2017 процесс аналогичен).
Создание проекта
Создадим новый проект ASP.NET Core Web Application в Visual Studio:
Назовем приложение и укажем путь к каталогу с проектом:
И выберем шаблон приложения API:
Модель
Создадим каталог Models и в новый каталог добавим первый класс TodoItem.cs, объекты которого будут описывать некоторые задачи списка дел в приложении:
В качестве СУБД мы будем использовать Sql Server, а доступ к базе данных будет осуществляться через Entity Framework Core и для начала установим фреймворк через встроенный пакетный менеджер NuGet:
Одним из подходов в работе с Entity Framework является подход «Code-First». Суть подхода заключается в том, что на основе модели приложения(в нашем случае модель представляет единственный класс — TodoItem.cs) формируется струткура базы данных(таблицы, первичные ключи, ссылки), вся эта работа происходит как бы «за кулисами» и напрямую с SQL мы не работаем. Обязательным условием класса модели является наличие поля первичного ключа, по умолчанию Entity Framework ищет целочисленное поле в имени которого присутствует подстрока «id» и формирует на его основе первичный ключ. Переопределить такое поведение можно с помощью специальных атрибутов или используя возможности Fluent API.
Главным компонентом в работе с Entity Framework является класс контекста базы данных, через который собственно и осуществляется доступ к данным в таблицах:
Базовый класс DbContext создает контекст БД и обеспечивает доступ к функциональности Entity Framework.
Для хранения данных приложения мы будем использовать SQL Server 2017 Express. Строки подключения хранятся в файле JSON под названием appsettings.json:
Далее нужно внести изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddDbContext() настраивает службы, предоставляемые инфраструктурой Entity Framework Core для класса контекста базы EFTodoDBContext. Аргументом метода AddDbContext () является лямбда-выражение, которое получает объект options, конфигурирующий базу данных для класса контекста. В этом случае база данных конфигурируется с помощью метода UseSqlServer() и указания строки подключения.
Определим основные операции для работы с задачами в интерфейсе ITodoRepository:
Данный интерфейс позволяет нам не задумываться о конкретной реализации хранилища данных, возможно мы точно не определились с выбором СУБД или ORM фреймворком, сейчас это не важно, класс описывающий доступ к данным будет наследовать от этого интерфейса.
Реализуем репозиторий, который как уже сказано ранее, будет наследовать от ITodoRepository и использовать в качестве источника данных EFTodoDBContext:Контроллер
Контроллер, реализация которого будет описана ниже, ничего не будет знать о контексте данных EFTodoDBContext, а будет использовать в своей работе только интерфейс ITodoRepository, что позволяет изменить источник данных не меняя при этом контроллера. Такой подход Адам Фримен в своей книге «Entity Framework Core 2 для ASP.NET Core MVC для профессионалов» назвал — паттерн «Хранилище».
Контроллер реализует обработчики стандартных методов HTTP-запросов: GET, POST, PUT, DELETE, которые будут изменять состояние наших задач, описанных в классе TodoItem.cs.
Добавим в каталог Controllers класс TodoController.cs со следующим содержимым:
Перед определением класса указан атрибут с описанием шаблона маршрута для доступа к контроллеру: [Route(«api/[controller]»)]. Контроллер TodoController будет доступен по следующему маршруту: https://<ip хоста>:<порт>/api/todo. В [controller] указывается название класса контроллера в нижнем регистре, опуская часть «Controller».
Перед определением каждого метода в контроллере TodoController указан специальный атрибут вида: [<метод HTTP>(«параметр»,Name = «псевдоним метода»)]. Атрибут определяет какой HTTP-запрос будет обработан данным методом, параметр, который передается в URI запроса и псевдоним метода с помощью которого можно переотправлять запрос. Если не указать атрибут, то по умолчанию инфраструктура MVC попытается найти самый подходящий метод в контроллере для обработки запроса исходя из названия метода и указанных параметров в запросе, так, если не указать в контроллере TodoController атрибут для метода Get(), то при HTTP-запросе методом GET: https://<ip хоста>:<порт>/api/todo, инфраструткура определит для обработки запроса метод Get() контроллера.
В своем конструкторе контроллер получает ссылку на объект типа ITodoRepository, но пока что инфраструктура MVC не знает, какой объект подставить при создании контроллера. Нужно создать сервис, который однозначно разрешит эту зависисмость, для этого внесем некотрые изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddTransient<ITodoRepository, EFTodoRepository>() определяет сервис, который каждый раз, когда требуется экземпляр типа ITodoRepository, например в контроллере, создает новый экземпляр класс EFTodoRepository.
Полный код класса Startup.cs:
Миграции
Для того чтобы Entity Framework сгенерировал базу данных и таблицы на основе модели, нужно использовать процесс миграции базы данных. Миграции — это группа команд, которая выполняет подготовку базы данных для работы с Entity Framework. Они используются для создания и синхронизации базы данных. Команды можно выполнять как в консоли диспетчера пакетов (Package Manager Console), так и в Power Shell(Developer Power Shell). Мы будем использовать консоль диспетчера пакетов, для работы с Entity Framework потребуется установить пакет Microsoft.EntityFrameworkCore.Tools:
Запустим консоль диспетчера пакетов и выполним команду Add-Migration Initial:
В проекте появится новый каталог — Migrations, в котором будут хранится классы миграции, на основе которых и будут создаваться объекты в базе данных после выполнения команды Update-Database:
Web API готово, запустив приложение на локальном IIS Express мы можем протестировать работу контроллера.
Тестирование WebAPI
Создадим новую коллекцию запросов в Postman под названием TodoWebAPI:
Так как наша база пуста, протестируем для начала создание новой задачи. В контроллере за создание задач отвечает метод Create(), который будет обрабатывать HTTP запрос отправленный методом POST и будет содержать в теле запроса сериализированный объект TodoItem в JSON формате. Аттрибут [FromBody] перед параметром todoItem в методе Create() подсказывает инфраструктуре MVC, что нужно десериализировать объект TodoItem из тела запроса и передать его в качестве параметра методу. Создадим запрос в Postman, который отправит на webAPI запрос на создание новой задачи:
Метод Create() после успешного создания задачи перенаправляет запрос на метод Get() с псевдонимом «GetTodoItem» и передает в качестве параметра Id только что созданной задачи, в результате чего в ответ на запрос мы получим созданный объект задачи в формате JSON.
Отправив HTTP запрос методом PUT и указав при этом в URI Id(https://localhost:44370/api/todo/1) уже созданного объекта, а в теле запроса передав объект с некоторыми изменениями в формате JSON, мы изменим этот объект в базе:
HTTP запросом с методом GET без указания параметров получим все объекты в базе:
Запрос HTTP с методом DELETE и указанием Id объекта в URI(https://localhost:44370/api/todo/2), удалит объект из базы и вернет JSON с удаленной задачей:
На этом все, в следующей части реализуем пользовательский интерфейс с помощью JavaScript-фреймворка Angular.
Ef core как получить iwebhostenvironment в модели
Для взаимодействия со средой, в которой запущено приложение, применяются объекты, реализующие интерфейс 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 в модели
Данное руководство устарело. Актуальное руководство: Руководство по 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:
Ef core как получить iwebhostenvironment в модели
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет сведения о среде веб-размещения, в которой выполняется приложение.
Свойства
Возвращает или задает IFileProvider, указывающий на WebRootPath.
Возвращает или задает абсолютный путь к каталогу, содержащему файлы содержимого приложения Web-обслуживаемые.
ASP.NET Web API + Entity Framework + Microsoft SQL Server + Angular. Часть 1
Небольшой курс по созданию простого веб-приложения с помощью технологий ASP.NET Core, фреймворка Entity Framework, СУБД Microsoft SQL Server и фреймворка Angular. Тестировать Web API будем через приложение Postman.
Курс состоит из нескольких частей:
- Создание Web API с помощью ASP.NET Web API и Entity Framework Core.
- Реализация пользовательского интерфейса на Angular.
- Добавление аутентификации в приложение.
- Расширение модели приложения и рассмотрение дополнительных возможностей Entity Framework.
Часть 1. Создание Web API с помощью ASP.NET Web API и Entity Framework Core
В качестве примера будем расматривать уже ставшее классическим — приложение списка дел. Для разработки приложения я буду использовать Visual Studio 2019(в Visual Studio 2017 процесс аналогичен).
Создание проекта
Создадим новый проект ASP.NET Core Web Application в Visual Studio:
Назовем приложение и укажем путь к каталогу с проектом:
И выберем шаблон приложения API:
Модель
Создадим каталог Models и в новый каталог добавим первый класс TodoItem.cs, объекты которого будут описывать некоторые задачи списка дел в приложении:
В качестве СУБД мы будем использовать Sql Server, а доступ к базе данных будет осуществляться через Entity Framework Core и для начала установим фреймворк через встроенный пакетный менеджер NuGet:
Одним из подходов в работе с Entity Framework является подход «Code-First». Суть подхода заключается в том, что на основе модели приложения(в нашем случае модель представляет единственный класс — TodoItem.cs) формируется струткура базы данных(таблицы, первичные ключи, ссылки), вся эта работа происходит как бы «за кулисами» и напрямую с SQL мы не работаем. Обязательным условием класса модели является наличие поля первичного ключа, по умолчанию Entity Framework ищет целочисленное поле в имени которого присутствует подстрока «id» и формирует на его основе первичный ключ. Переопределить такое поведение можно с помощью специальных атрибутов или используя возможности Fluent API.
Главным компонентом в работе с Entity Framework является класс контекста базы данных, через который собственно и осуществляется доступ к данным в таблицах:
Базовый класс DbContext создает контекст БД и обеспечивает доступ к функциональности Entity Framework.
Для хранения данных приложения мы будем использовать SQL Server 2017 Express. Строки подключения хранятся в файле JSON под названием appsettings.json:
Далее нужно внести изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddDbContext() настраивает службы, предоставляемые инфраструктурой Entity Framework Core для класса контекста базы EFTodoDBContext. Аргументом метода AddDbContext () является лямбда-выражение, которое получает объект options, конфигурирующий базу данных для класса контекста. В этом случае база данных конфигурируется с помощью метода UseSqlServer() и указания строки подключения.
Определим основные операции для работы с задачами в интерфейсе ITodoRepository:
Данный интерфейс позволяет нам не задумываться о конкретной реализации хранилища данных, возможно мы точно не определились с выбором СУБД или ORM фреймворком, сейчас это не важно, класс описывающий доступ к данным будет наследовать от этого интерфейса.
Реализуем репозиторий, который как уже сказано ранее, будет наследовать от ITodoRepository и использовать в качестве источника данных EFTodoDBContext:Контроллер
Контроллер, реализация которого будет описана ниже, ничего не будет знать о контексте данных EFTodoDBContext, а будет использовать в своей работе только интерфейс ITodoRepository, что позволяет изменить источник данных не меняя при этом контроллера. Такой подход Адам Фримен в своей книге «Entity Framework Core 2 для ASP.NET Core MVC для профессионалов» назвал — паттерн «Хранилище».
Контроллер реализует обработчики стандартных методов HTTP-запросов: GET, POST, PUT, DELETE, которые будут изменять состояние наших задач, описанных в классе TodoItem.cs.
Добавим в каталог Controllers класс TodoController.cs со следующим содержимым:
Перед определением класса указан атрибут с описанием шаблона маршрута для доступа к контроллеру: [Route(«api/[controller]»)]. Контроллер TodoController будет доступен по следующему маршруту: https://<ip хоста>:<порт>/api/todo. В [controller] указывается название класса контроллера в нижнем регистре, опуская часть «Controller».
Перед определением каждого метода в контроллере TodoController указан специальный атрибут вида: [<метод HTTP>(«параметр»,Name = «псевдоним метода»)]. Атрибут определяет какой HTTP-запрос будет обработан данным методом, параметр, который передается в URI запроса и псевдоним метода с помощью которого можно переотправлять запрос. Если не указать атрибут, то по умолчанию инфраструктура MVC попытается найти самый подходящий метод в контроллере для обработки запроса исходя из названия метода и указанных параметров в запросе, так, если не указать в контроллере TodoController атрибут для метода Get(), то при HTTP-запросе методом GET: https://<ip хоста>:<порт>/api/todo, инфраструткура определит для обработки запроса метод Get() контроллера.
В своем конструкторе контроллер получает ссылку на объект типа ITodoRepository, но пока что инфраструктура MVC не знает, какой объект подставить при создании контроллера. Нужно создать сервис, который однозначно разрешит эту зависисмость, для этого внесем некотрые изменения в класс Startup.cs, добавив в метод ConfigureServices() следующий код:
Метод AddTransient<ITodoRepository, EFTodoRepository>() определяет сервис, который каждый раз, когда требуется экземпляр типа ITodoRepository, например в контроллере, создает новый экземпляр класс EFTodoRepository.
Полный код класса Startup.cs:
Миграции
Для того чтобы Entity Framework сгенерировал базу данных и таблицы на основе модели, нужно использовать процесс миграции базы данных. Миграции — это группа команд, которая выполняет подготовку базы данных для работы с Entity Framework. Они используются для создания и синхронизации базы данных. Команды можно выполнять как в консоли диспетчера пакетов (Package Manager Console), так и в Power Shell(Developer Power Shell). Мы будем использовать консоль диспетчера пакетов, для работы с Entity Framework потребуется установить пакет Microsoft.EntityFrameworkCore.Tools:
Запустим консоль диспетчера пакетов и выполним команду Add-Migration Initial:
В проекте появится новый каталог — Migrations, в котором будут хранится классы миграции, на основе которых и будут создаваться объекты в базе данных после выполнения команды Update-Database:
Web API готово, запустив приложение на локальном IIS Express мы можем протестировать работу контроллера.
Тестирование WebAPI
Создадим новую коллекцию запросов в Postman под названием TodoWebAPI:
Так как наша база пуста, протестируем для начала создание новой задачи. В контроллере за создание задач отвечает метод Create(), который будет обрабатывать HTTP запрос отправленный методом POST и будет содержать в теле запроса сериализированный объект TodoItem в JSON формате. Аттрибут [FromBody] перед параметром todoItem в методе Create() подсказывает инфраструктуре MVC, что нужно десериализировать объект TodoItem из тела запроса и передать его в качестве параметра методу. Создадим запрос в Postman, который отправит на webAPI запрос на создание новой задачи:
Метод Create() после успешного создания задачи перенаправляет запрос на метод Get() с псевдонимом «GetTodoItem» и передает в качестве параметра Id только что созданной задачи, в результате чего в ответ на запрос мы получим созданный объект задачи в формате JSON.
Отправив HTTP запрос методом PUT и указав при этом в URI Id(https://localhost:44370/api/todo/1) уже созданного объекта, а в теле запроса передав объект с некоторыми изменениями в формате JSON, мы изменим этот объект в базе:
HTTP запросом с методом GET без указания параметров получим все объекты в базе:
Запрос HTTP с методом DELETE и указанием Id объекта в URI(https://localhost:44370/api/todo/2), удалит объект из базы и вернет JSON с удаленной задачей:
На этом все, в следующей части реализуем пользовательский интерфейс с помощью JavaScript-фреймворка Angular.
Ef core как получить iwebhostenvironment в модели
Для взаимодействия со средой, в которой запущено приложение, применяются объекты, реализующие интерфейс 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:
Внедрить IWebHostingEnvironment в переопределенный метод
Используя ASP.NET Core 5.0, я пытаюсь получить доступ к IWebHostEnvironment в классе модели EF Core 5.0. Как я могу получить доступ к проверке истинности IsDevelopment из окружения?
Я вызываю класс ниже из моих контроллеров следующим образом:
Мне действительно нужно также раскрутить IWebHostEnvironment в каждом контроллере, который вызывает этот класс EF, чтобы указать правильный конструктор?
Я видел несколько угроз о DI, но, честно говоря, у них есть запутанные решения, которые я не могу понять.
Ef core как получить iwebhostenvironment в модели
Внедрить 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:
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.
16 Answers 16
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.
If you need to test this somewhere in your codebase that doesn’t have easy access to the IHostingEnvironment, another easy way to do it is like this:
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.
Code Murals
This blog is going to illustrate how to implement Entity Framework (EF) Core with SQL Server LocalDB. The Entity Framework Core enables access to data from the database. This allows developers to avoid having to write most of the data access code. And the SQL Server LocalDB works similarly to the SQL SERVER with few features. You can get the LocalDB when you install visual studio or visual studio express. You can find the .mdf and _log.ldf files in the C:/Users/ directory.
Let see how to create a SQL Server LocalDB and implement Entity Framework Core
Step 1:
The first step is to add a connection. In the menu -> click Tools and select Connect to DatabaseIt will display the Add Connection window. Enter (localdb)\mssqllocaldb in the server name textbox. Then in the Select or enter a database, select master and click ok
Now in the server explorer, you can find the master DB containing Tables, Views, Stored Procedures, etc.
Step 2:
This step, going to describe how to create a new database. To create a new database, right-click on the master database in the server explorer and select New Query. It will open the New Query window.In the query window, you can write the query to create a new database like the one below. Click the Execute button to run the query or press Ctrl + Shift + E to run the Query
Also, you can create the database using GUI. For that, In Server Explorer, right-click on the Data Connection and select Create New SQL Server Database. It will open the Create New SQL Server Database window. Enter the server name (localdb)\mssqllocaldb in the server name textbox and enter your new database name and click the ok button to create a database.
For GUI, Right-click on the Table folder in Server Explorer and select Add New Table.
Step 4:
To use the Database in ASP.NET Core, I have to use Microsoft Entity Framework core. The following is a command to install the Entity Framework core packages using Package Manager Console. To get a Package Manager Console click Tools -> NuGet Package Manager -> Package Manager ConsoleThe below one is a screenshot of Solution Explorer. You can find a list of entity framework core packages under the package.
Step 5:
The next step is a DB Model creation. I have created a folder called Models to store the models. Now following command is to create a DBContext. Run this command in Package Manager ConsoleThe following is a screenshot of the solution explorer after executing the Scaffold-DbContext command. Here you can see the SamepleDBContext.cs and MovieTable.cs files under the Models folder.
Step 6:
This step is going to explain how to update the Entity Framework Core. I have added a new column CoProduction to the table MovieTable.The following is a Scaffold-DbContext command to update the Entity Framework Core.