Доступ до IHostingEnvironment у методі ConfigureServices


100

Мені потрібно перевірити ConfigureServicesметод, чи поточне ім’я середовища хостингу - „Розробка”.

Тож використання IHostingEnvironment.IsDevelopment()методу для мене може бути нормальним, але на відміну від методу Налаштування, у мене цього немає IHostingEnvironment env.

Відповіді:


128

просто створіть властивість у класі Startup, щоб зберегти IHostingEnvironment. Встановіть властивість у конструкторі автозавантаження, звідки ви вже маєте доступ, тоді ви зможете отримати доступ до властивості з ConfigureServices


34
Незважаючи на те, що нові шаблони проектів для Asp.Net Core 2.0 не містять параметр "IHostingEnvironment env" у конструкторі запуску, його можна вказати, і він буде належним чином введений.
Аугусто Баррето

3
Чому в ConfigureServicesцьому неможливо?
Александро

2
@Alexsandro_xpt, щоб задокументувати відповідь на ваше запитання ConfigureServices, неможливо, оскільки фреймворк не підтримує ін’єкцію залежності для цього конкретного методу так, як це робиться в інших областях (можливо, тому, що ви використовуєте цей метод для налаштування ін’єкції залежностей). Налаштування на рівні конструктора, як описав Джо, повинно обійти проблему.
Matt Eland

@MarkG На жаль, цю відповідь видалено ... її Q було позначено як копію цієї. Тож включаючи сюди ...
Річард

26

Скопійовано тут із запитання, позначеного як копія цього, та видалено . Кредит 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()інше ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.