Zugriff auf die IHostingEnvironment in der ConfigureServices-Methode

100

Ich muss die ConfigureServicesMethode einchecken , ob der aktuelle Name der Hosting-Umgebung "Entwicklung" lautet.

Die Verwendung der IHostingEnvironment.IsDevelopment()Methode mag für mich in Ordnung sein, aber im Gegensatz zur Methode "Konfigurieren" habe ich keine IHostingEnvironment env.

einstellen
quelle

Antworten:

128

Erstellen Sie einfach eine Eigenschaft in der Startup-Klasse, um die IHostingEnvironment beizubehalten. Legen Sie die Eigenschaft im Startkonstruktor fest, auf den Sie bereits Zugriff haben, und greifen Sie dann über ConfigureServices auf die Eigenschaft zu

Joe Audette
quelle
34
Obwohl die neuen Projektvorlagen für Asp.Net Core 2.0 den Parameter "IHostingEnvironment env" nicht im Startup-Konstruktor enthalten, kann er angegeben werden und wird ordnungsgemäß eingefügt.
Augusto Barreto
3
Warum ConfigureServicesist es unmöglich?
Alexsandro
2
@Alexsandro_xpt, um die Antwort auf Ihre Frage zu dokumentieren ConfigureServices, ist unmöglich, da das Framework die Abhängigkeitsinjektion für diese bestimmte Methode nicht wie in anderen Bereichen unterstützt (wahrscheinlich, weil Sie diese Methode zum Konfigurieren der Abhängigkeitsinjektion verwenden). Die Einstellung auf Konstruktorebene, wie von Joe beschrieben, sollte das Problem umgehen.
Matt Eland
@MarkG Leider wird diese Antwort gelöscht ... das Q wurde als Duplikat dieser markiert. Also auch hier ...
Richard
26

Hier von der Frage kopiert, die als Duplikat dieser Frage markiert und gelöscht wurde . Gutschrift an a-ctor .

Wenn Sie zugreifen möchten IHostingEnvironmentin ConfigureServicesSie müssen es über den Konstruktor injizieren und speichern sie für einen späteren Zugriff in 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
quelle
Hallo, es ist keine große Sache, aber in der Zeichenfolgenformatierung environmentist das Kleinbuchstaben, während die Eigenschaft zu sein scheint Environment.
timmi4sa
1
@ BenSmith Ich glaube du hast einen Tippfehler. Sie wiederholten IHostingEnvironment in Ihrer Aussage "IHostingEnvironment ist jetzt veraltet und IHostingEnvironment sollte stattdessen verwendet werden. Was ist der richtige Ersatz für IHostingEnvironment?
Blake
Doh! Guter Ort @Blake. Ich werde meinen vorherigen Kommentar löschen. Mein Kommentar hätte lauten sollen "IHostingEnvironment ist jetzt veraltet, stattdessen sollte IWebHostEnvironment verwendet werden".
Ben Smith
Und um ganz klar zu sein, sollte man nicht sagen, dass dies IHostingEnvironmenterst ab veraltet ist .Net Core 3.0? (Ich arbeite an einem "Take-Home-Test", der services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);die ConfigureServices()Methode aufruft, und IHostingEnvironment funktioniert einwandfrei.
Scott Fraley
@ScottFraley richtig. Da diese Frage und Antwort aus dem Zeitrahmen von .NET Core 2.x stammt (den viele Projekte noch einige Zeit verwenden werden), gilt sie weiterhin.
Richard
0

IHostingEnvironment ist in Core 3.1 veraltet

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

sollte den Trick machen ...

Dann verweisen Sie überall mit _env.IsDevelopment()etc ...

Boycs
quelle