Accediendo al IHostingEnvironment en el método ConfigureServices

100

Necesito comprobar en el ConfigureServicesmétodo si el nombre del entorno de alojamiento actual es 'Desarrollo'.

Entonces, usar el IHostingEnvironment.IsDevelopment()método puede estar bien para mí, pero a diferencia del método Configurar, no lo tengo IHostingEnvironment env.

Conjunto
fuente

Respuestas:

128

simplemente cree una propiedad en la clase Startup para conservar el IHostingEnvironment. Establezca la propiedad en el constructor de inicio donde ya tiene acceso, luego puede acceder a la propiedad desde ConfigureServices

Joe Audette
fuente
34
Aunque las nuevas plantillas de proyecto para Asp.Net Core 2.0 no incluyen el parámetro "IHostingEnvironment env" en el constructor de inicio, se puede especificar y se inyectará correctamente.
Augusto Barreto
3
¿Por qué ConfigureServiceses imposible?
Alexsandro
2
@Alexsandro_xpt para documentar la respuesta a su pregunta ConfigureServices, es imposible porque el marco no admite la inyección de dependencia para ese método en particular como lo hace en otras áreas (probablemente porque utiliza este método para configurar la inyección de dependencia). Establecer en el nivel de constructor como lo describió Joe debería solucionar el problema.
Matt Eland
@MarkG Desafortunadamente, esa respuesta se eliminó ... su Q se marcó como un duplicado de esta. Así que incluyendo aquí ...
Richard
26

Copiado aquí de la pregunta marcada como duplicado de esta y eliminada . Crédito a a-ctor .

Si desea acceder IHostingEnvironmenten el ConfigureServicesque tendrá que inyectar a través del constructor y almacenarla para su posterior acceso en 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
fuente
Hola, no es un gran problema, pero en el formato de cadena environmentes minúscula, mientras que la propiedad parece serlo Environment.
timmi4sa
1
@BenSmith Creo que tienes un error tipográfico. Repitió IHostingEnvironment en su declaración "IHostingEnvironment ahora está obsoleto y IHostingEnvironment debería usarse en su lugar. ¿Cuál es el reemplazo correcto para IHostingEnvironment?
Blake
Doh! Buen lugar @ Blake. Eliminaré mi comentario anterior. Mi comentario debería haber leído "IHostingEnvironment ahora está obsoleto, en su lugar debería utilizarse IWebHostEnvironment".
Ben Smith
Y para ser más claro, ¿no debería decirse que IHostingEnvironmentsolo está obsoleto a partir de .Net Core 3.0? (Estoy trabajando en una 'prueba para llevar a casa' que llama services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);dentro del ConfigureServices()método e IHostingEnvironment funciona bien.
Scott Fraley
@ScottFraley correcto. Como esta pregunta y respuesta provienen del marco de tiempo de .NET Core 2.x (que muchos proyectos continuarán usando durante bastante tiempo), todavía se aplica.
Richard
1

IHostingEnvironment está en desuso en Core 3.1

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

debería hacer el truco ...

Luego haga referencia a cualquier lugar con _env.IsDevelopment()etc ...

Boycs
fuente