Mengakses IHostingEnvironment dalam metode ConfigureServices

102

Saya perlu memeriksa ConfigureServicesmetode apakah nama lingkungan hosting saat ini adalah 'Pengembangan'.

Jadi menggunakan IHostingEnvironment.IsDevelopment()metode mungkin baik-baik saja bagi saya, tetapi tidak seperti dalam metode Konfigurasi, saya tidak punya IHostingEnvironment env.

Set
sumber

Jawaban:

129

cukup buat properti di kelas Startup untuk mempertahankan IHostingEnvironment. Set properti di konstruktor Startup di mana Anda sudah memiliki akses, lalu Anda dapat mengakses properti dari ConfigureServices

Joe Audette
sumber
36
Meskipun template proyek baru untuk Asp.Net Core 2.0 tidak menyertakan parameter "IHostingEnvironment env" di konstruktor Startup, itu dapat ditentukan dan akan dimasukkan dengan benar.
Augusto Barreto
3
Mengapa ConfigureServicestidak mungkin?
Alexsandro
2
@Alexsandro_xpt untuk mendokumentasikan jawaban atas pertanyaan Anda pada ConfigureServices, tidak mungkin karena framework tidak mendukung Injeksi Ketergantungan untuk metode tertentu seperti yang dilakukannya di area lain (mungkin karena Anda menggunakan metode ini untuk mengonfigurasi injeksi ketergantungan). Pengaturan di tingkat konstruktor seperti yang dijelaskan Joe harus mengatasi masalah tersebut.
Matt Eland
@MarkG Sayangnya jawaban itu dihapus ... Q-nya telah ditandai sebagai duplikat dari yang satu ini. Jadi termasuk di sini ...
Richard
27

Disalin di sini dari pertanyaan yang ditandai sebagai duplikat dari pertanyaan ini dan dihapus . Penghargaan untuk a-ctor .

Jika Anda ingin akses IHostingEnvironmentdi ConfigureServicesAnda akan harus menyuntikkan melalui constructor dan menyimpannya untuk akses kemudian di 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
sumber
Hai, ini bukan masalah besar tetapi dalam format string menggunakan environmenthuruf kecil, sedangkan properti tampaknya Environment.
timmi4sa
1
@BenSaya yakin Anda salah ketik. Anda mengulangi IHostingEnvironment dalam pernyataan Anda "IHostingEnvironment sekarang sudah usang dan IHostingEnvironment harus digunakan sebagai gantinya. Apa pengganti yang benar untuk IHostingEnvironment?
Blake
Doh! Tempat yang bagus @Blake. Saya akan menghapus komentar saya sebelumnya. Komentar saya seharusnya membaca "IHostingEnvironment sekarang usang, sebagai gantinya IWebHostEnvironment harus digunakan".
Ben Smith
Dan untuk lebih jelasnya, bukankah seharusnya dikatakan bahwa IHostingEnvironmentitu hanya usang .Net Core 3.0? (Saya sedang mengerjakan 'tes dibawa pulang' yang memanggil services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);ke dalam ConfigureServices()metode dan IHostingEnvironment berfungsi dengan baik.
Scott Fraley
@ScottTY benar. Karena pertanyaan dan jawaban ini berasal dari kerangka waktu .NET Core 2.x (yang akan terus digunakan oleh banyak proyek untuk beberapa waktu), ini masih berlaku.
Richard
1

IHostingEnvironment tidak digunakan lagi di Inti 3.1

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

harus melakukan trik ...

Kemudian referensi di mana saja dengan _env.IsDevelopment()dll ...

Boycs
sumber