Доступ к IHostingEnvironment в методе ConfigureServices

102

Мне нужно проверить ConfigureServicesметод, является ли текущее имя среды хостинга «Разработка».

Поэтому использование IHostingEnvironment.IsDevelopment()метода может быть для меня приемлемым, но, в отличие от метода Configure, у меня его нет IHostingEnvironment env.

Устанавливать
источник

Ответы:

129

просто создайте свойство в классе Startup, чтобы сохранить IHostingEnvironment. Задайте свойство в конструкторе Startup, к которому у вас уже есть доступ, затем вы можете получить доступ к свойству из ConfigureServices.

Джо Одетт
источник
36
Несмотря на то, что новые шаблоны проектов для Asp.Net Core 2.0 не включают параметр «IHostingEnvironment env» в конструкторе Startup, его можно указать, и он будет правильно внедрен.
Аугусто Баррето
3
Почему в ConfigureServicesнем нельзя?
Alexsandro
2
@Alexsandro_xpt, чтобы задокументировать ответ на ваш вопрос ConfigureServices, это невозможно, потому что фреймворк не поддерживает внедрение зависимостей для этого конкретного метода, как это происходит в других областях (вероятно, потому, что вы используете этот метод для настройки внедрения зависимостей). Настройка на уровне конструктора, как описал Джо, должна помочь обойти проблему.
Мэтт Эланд
@MarkG К сожалению, этот ответ удален ... его Q был отмечен как дубликат этого. Итак, в том числе и здесь ...
Ричард
27

Скопировано сюда из вопроса, помеченного как дубликат этого и удаленного . Кредит a-ctor .

Если вы хотите получить доступ IHostingEnvironmentв ConfigureServicesвас будет вводить его с помощью конструктора и сохранить его для последующего доступа в ConfigureServices:

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment environment)
    {
        Configuration = configuration;
        Environment = environment;
    }

    public IConfiguration Configuration { get; }

    public IHostingEnvironment Environment { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        System.Console.WriteLine($"app: {Environment.ApplicationName}");
    }

    // rest omitted
}
Ричард
источник
Привет, это не имеет большого значения, но в форматировании строки environmentстрочные буквы, а свойство вроде бы Environment.
timmi4sa
1
@BenSmith Я полагаю, у вас есть опечатка. Вы повторили IHostingEnvironment в своем заявлении: «IHostingEnvironment теперь является устаревшим, и вместо него следует использовать IHostingEnvironment. Какая правильная замена для IHostingEnvironment?»
Блейк
Дох! Хорошее место @Blake. Удаляю свой предыдущий комментарий. Мой комментарий должен был быть следующим: «IHostingEnvironment теперь устарела, вместо этого следует использовать IWebHostEnvironment».
Бен Смит
И чтобы быть более ясным, не следует ли говорить, что IHostingEnvironmentэто устарело только с .Net Core 3.0? (Я работаю над «домашним тестом», который вызывает services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);внутри ConfigureServices()метода, и IHostingEnvironment работает нормально.
Скотт Фрейли,
@ScottFraley правильно. Поскольку этот вопрос и ответ исходит из временных рамок .NET Core 2.x (которые многие проекты будут продолжать использовать в течение некоторого времени), он все еще применяется.
Ричард
1

IHostingEnvironment устарело в Core 3.1

        private readonly IWebHostEnvironment _env;
   
        public Startup(IConfiguration configuration, IWebHostEnvironment env)
        {
            _env = env;
            Configuration = configuration;
        }

должен сделать свое дело ...

Затем ссылка где угодно с и _env.IsDevelopment()т.д ...

Бойки
источник