Acessando o IHostingEnvironment no método ConfigureServices

100

Preciso verificar o ConfigureServicesmétodo se o nome do ambiente de hospedagem atual é 'Desenvolvimento'.

Portanto, usar o IHostingEnvironment.IsDevelopment()método pode ser bom para mim, mas ao contrário do método Configurar, eu não tenho IHostingEnvironment env.

Conjunto
fonte

Respostas:

128

basta criar uma propriedade na classe Startup para persistir o IHostingEnvironment. Defina a propriedade no construtor Startup onde você já tem acesso, então você pode acessar a propriedade a partir de ConfigureServices

Joe Audette
fonte
34
Mesmo que os novos modelos de projeto para Asp.Net Core 2.0 não incluam o parâmetro "IHostingEnvironment env" no construtor de inicialização, ele pode ser especificado e será injetado corretamente.
Augusto Barreto
3
Por que ConfigureServicesisso é impossível?
Alexsandro
2
@Alexsandro_xpt para documentar a resposta à sua pergunta ConfigureServices, é impossível porque o framework não suporta injeção de dependência para aquele método em particular da maneira que faz em outras áreas (provavelmente porque você usa este método para configurar injeção de dependência). Definir no nível do construtor como Joe descreveu deve contornar o problema.
Matt Eland
@MarkG Infelizmente essa resposta foi deletada ... o seu Q foi marcado como uma duplicata desta. Incluindo aqui ...
Richard
26

Copiado aqui da pergunta marcada como duplicata desta e excluída . Crédito para a-ctor .

Se você quiser acessar IHostingEnvironmentem ConfigureServices, terá que injetá-lo através do construtor e armazená-lo para acesso posterior em 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
}
Richard
fonte
Olá, não é um grande problema, mas na formatação da string environmentestá em minúsculas, enquanto a propriedade parece ser Environment.
timmi4sa
1
@BenSmith Acredito que você tenha cometido um erro de digitação. Você repetiu IHostingEnvironment em sua declaração "IHostingEnvironment está obsoleto e IHostingEnvironment deve ser usado. Qual é a substituição correta para IHostingEnvironment?
Blake
Doh! Bom local, @Blake. Vou deletar meu comentário anterior. Meu comentário deveria ser "IHostingEnvironment agora está obsoleto, IWebHostEnvironment deve ser usado em seu lugar".
Ben Smith
E para ser mais claro, não deveria ser dito que IHostingEnvironmentsó está obsoleto a partir de agora .Net Core 3.0? (Estou trabalhando em um 'teste para levar para casa' que chama services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);dentro do ConfigureServices()método e IHostingEnvironment está funcionando bem.
Scott Fraley
@ScottFraley correto. Como essa pergunta e resposta vem do período de tempo do .NET Core 2.x (que muitos projetos continuarão a usar por algum tempo), ela ainda se aplica.
Richard
1

IHostingEnvironment está obsoleto no Core 3.1

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

deve fazer o truque ...

Em seguida, faça referência a qualquer lugar com _env.IsDevelopment()etc ...

Boycs
fonte