108 votes

Accès à l'IHostingEnvironment dans la méthode ConfigureServices

J'ai besoin de vérifier ConfigureServices Méthode permettant de déterminer si le nom de l'environnement d'hébergement actuel est "Development".

Donc, en utilisant IHostingEnvironment.IsDevelopment() peut me convenir, mais contrairement à la méthode Configure, je ne dispose pas de IHostingEnvironment env .

0 votes

135voto

Joe Audette Points 15293

Il suffit de créer une propriété dans la classe Startup pour faire persister l'IHostingEnvironment. Définissez la propriété dans le constructeur de la classe Startup où vous avez déjà un accès, puis vous pouvez accéder à la propriété depuis ConfigureServices.

37 votes

Même si les nouveaux modèles de projet pour Asp.Net Core 2.0 n'incluent pas le paramètre "IHostingEnvironment env" dans le constructeur Startup, il peut être spécifié et il sera correctement injecté.

3 votes

Pourquoi dans ConfigureServices c'est impossible ?

2 votes

@Alexsandro_xpt pour documenter la réponse à votre question sur ConfigureServices Si vous utilisez une méthode d'injection de dépendances, c'est impossible car le framework ne supporte pas l'injection de dépendances pour cette méthode particulière comme il le fait dans d'autres domaines (probablement parce que vous utilisez cette méthode pour configurer l'injection de dépendances). La configuration au niveau du constructeur, telle que décrite par Joe, devrait permettre de résoudre le problème.

35voto

Richard Points 54016

Copié ici de la question marqué comme duplicata de celui-ci et supprimé . Crédit à a-ctor .

Si vous voulez accéder à IHostingEnvironment en ConfigureServices vous devrez l'injecter via le constructeur et le stocker pour un accès ultérieur dans le fichier 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
}

4voto

Boycs Points 1973

IHostingEnvironment est déprécié dans Core 3.1

        private readonly IWebHostEnvironment _env;

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

devrait faire l'affaire...

Ensuite, faites référence à n'importe quel endroit avec _env.IsDevelopment() etc...

1voto

Mike Christensen Points 29735

Si vous n'utilisez pas un Startup et appellent .Configure() directement, vous pouvez accéder à la IHostingEnvironment o IWebHostEnvironment en utilisant GetService :

ASP.NET Core 2.2 :

.Configure(app => {
    var hostingEnvironment = app.ApplicationServices.GetService<IHostingEnvironment>();
    if (hostingEnvironment?.IsDevelopment() == true)
    {
        app.UseDeveloperExceptionPage();
    }

    // .. Other stuff
});

ASP.NET Core 3.x :

.Configure(app => {
    var hostingEnvironment = app.ApplicationServices.GetService<IWebHostEnvironment>();
    if (hostingEnvironment?.IsDevelopment() == true)
    {
        app.UseDeveloperExceptionPage();
    }

    // .. Other stuff
});

0voto

Rugbrød Points 148

Si vous n'avez pas de classe Startup (vous pouvez créer un service), vous pouvez obtenir l'environnement à partir du hostContext dans ConfigureServices comme suit :

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    IConfiguration config = hostContext.Configuration;
                    Configuration = config;

                    var env = hostContext.HostingEnvironment;
                    EnvironmentName = env?.EnvironmentName;

...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X