Accéder à IHostingEnvironment dans la méthode ConfigureServices

100

J'ai besoin de vérifier dans la ConfigureServicesméthode si le nom actuel de l'environnement d'hébergement est «Développement».

Donc, utiliser la IHostingEnvironment.IsDevelopment()méthode peut me convenir, mais contrairement à la méthode Configure, je ne l'ai pas IHostingEnvironment env.

Ensemble
la source

Réponses:

128

créez simplement une propriété dans la classe Startup pour conserver IHostingEnvironment. Définissez la propriété dans le constructeur de démarrage auquel vous avez déjà accès, puis vous pouvez accéder à la propriété à partir de ConfigureServices

Joe Audette
la source
34
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 de démarrage, il peut être spécifié et il sera correctement injecté.
Augusto Barreto
3
Pourquoi ConfigureServicesest-ce impossible?
Alexsandro
2
@Alexsandro_xpt pour documenter la réponse à votre question ConfigureServices, c'est impossible car le framework ne prend pas en charge 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 définition au niveau du constructeur comme décrit par Joe devrait contourner le problème.
Matt Eland
@MarkG Malheureusement cette réponse est supprimée ... le son Q ayant été marqué comme un double de celui-ci. Donc, y compris ici ...
Richard
26

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

Si vous souhaitez accéder IHostingEnvironmentà ConfigureServicesvous devrez injecter par le constructeur et le stocker pour un accès plus tard 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
la source
Salut, ce n'est pas un gros problème, mais dans le formatage de la chaîne, le environmentest en minuscules, alors que la propriété semble l'être Environment.
timmi4sa
1
@BenSmith Je crois que vous avez une faute de frappe. Vous avez répété IHostingEnvironment dans votre déclaration "IHostingEnvironment est maintenant obsolète et IHostingEnvironment devrait être utilisé à la place. Quel est le remplacement correct pour IHostingEnvironment?
Blake
Doh! Bon spot @Blake. Je supprimerai mon commentaire précédent. Mon commentaire aurait dû se lire "IHostingEnvironment est maintenant obsolète, IWebHostEnvironment devrait être utilisé à la place".
Ben Smith
Et pour être plus clair, ne faut-il pas dire que ce IHostingEnvironmentn'est obsolète que depuis .Net Core 3.0? (Je travaille sur un `` test à emporter '' qui appelle services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);à l'intérieur de la ConfigureServices()méthode et IHostingEnvironment fonctionne bien.
Scott Fraley
@ScottFraley correct. Comme cette question et réponse provient de la période .NET Core 2.x (que de nombreux projets continueront d'utiliser pendant un certain temps), elle s'applique toujours.
Richard
1

IHostingEnvironment est obsolète dans Core 3.1

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

devrait faire l'affaire ...

Puis référencez n'importe où avec _env.IsDevelopment()etc ...

Boycs
la source