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.

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


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
}

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 ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.