Dostęp do IHostingEnvironment w metodzie ConfigureServices

102

Muszę sprawdzić ConfigureServicesmetodę, czy nazwa bieżącego środowiska hostingu to „Programowanie”.

Więc użycie IHostingEnvironment.IsDevelopment()metody może być dla mnie ok, ale w przeciwieństwie do metody Configure, nie mam IHostingEnvironment env.

Zestaw
źródło

Odpowiedzi:

129

wystarczy utworzyć właściwość w klasie Startup, aby zachować IHostingEnvironment. Ustaw właściwość w konstruktorze Startup, do którego masz już dostęp, a następnie możesz uzyskać dostęp do właściwości z ConfigureServices

Joe Audette
źródło
36
Mimo że nowe szablony projektów dla Asp.Net Core 2.0 nie zawierają parametru „IHostingEnvironment env” w konstruktorze startowym, można go określić i zostanie prawidłowo wstrzyknięty.
Augusto Barreto
3
Dlaczego w ConfigureServicesto niemożliwe?
Alexsandro
2
@Alexsandro_xpt, aby udokumentować odpowiedź na twoje pytanie ConfigureServices, jest to niemożliwe, ponieważ framework nie obsługuje wstrzykiwania zależności dla tej konkretnej metody tak, jak robi to w innych obszarach (prawdopodobnie dlatego, że używasz tej metody do konfigurowania wstrzykiwania zależności). Ustawienie na poziomie konstruktora, jak opisał Joe, powinno obejść ten problem.
Matt Eland,
@MarkG Niestety ta odpowiedź została usunięta ... jej Q zostało oznaczone jako duplikat tej odpowiedzi. Więc włączając tutaj ...
Richard,
27

Tutaj skopiowano z pytania oznaczonego jako duplikat tego i usunięto . Kredyt dla a-ctor .

Jeśli chcesz uzyskać dostęp IHostingEnvironmentdo ConfigureServices, będziesz musiał wstrzyknąć go za pomocą konstruktora i zapisać do późniejszego dostępu w 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
źródło
Cześć, to nie jest wielka sprawa, ale w formatowaniu ciągu znaków environmentjest mała litera, podczas gdy właściwość wydaje się być Environment.
timmi4sa
1
@BenSmith Myślę, że masz literówkę. Powtórzyłeś IHostingEnvironment w swoim oświadczeniu „IHostingEnvironment jest teraz przestarzały i zamiast tego należy użyć IHostingEnvironment. Jaki jest prawidłowy zamiennik IHostingEnvironment?
Blake
No! Dobre miejsce @Blake. Usunę mój poprzedni komentarz. Mój komentarz powinien był brzmieć: „IHostingEnvironment jest teraz przestarzały, zamiast tego należy użyć IWebHostEnvironment”.
Ben Smith
A żeby było jeszcze bardziej jasne, czy nie należy powiedzieć, że IHostingEnvironmentjest on przestarzały dopiero od dnia .Net Core 3.0? (Pracuję nad „testem do domu”, który wywołuje services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);wewnątrz ConfigureServices()metody, a IHostingEnvironment działa dobrze.
Scott Fraley
@ScottFraley poprawne. Ponieważ to pytanie i odpowiedź pochodzą z przedziału czasowego .NET Core 2.x (z którego wiele projektów będzie nadal korzystać przez dłuższy czas), ma ono nadal zastosowanie.
Richard
1

IHostingEnvironment jest przestarzałe w Core 3.1

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

powinien załatwić sprawę ...

Następnie odwołaj się do dowolnego miejsca za pomocą _env.IsDevelopment()etc ...

Bojki
źródło