การเข้าถึง IHostingEnvironment ในวิธี ConfigureServices


104

ฉันต้องการตรวจสอบConfigureServicesวิธีการว่าชื่อสภาพแวดล้อมการโฮสต์ปัจจุบันเป็น 'การพัฒนา' หรือไม่

ดังนั้นการใช้IHostingEnvironment.IsDevelopment()วิธีการอาจจะโอเคสำหรับผม IHostingEnvironment envแต่แตกต่างในวิธีการกำหนดค่าฉันไม่ได้มี

คำตอบ:


132

เพียงแค่สร้างคุณสมบัติในคลาส Startup เพื่อคงไว้ซึ่ง IHostingEnvironment ตั้งค่าคุณสมบัติในตัวสร้างการเริ่มต้นที่คุณมีสิทธิ์เข้าถึงแล้วคุณสามารถเข้าถึงคุณสมบัติจาก ConfigureServices


36
แม้ว่าเทมเพลตโปรเจ็กต์ใหม่สำหรับ Asp.Net Core 2.0 จะไม่มีพารามิเตอร์ "IHostingEnvironment env" ในตัวสร้างการเริ่มต้น แต่ก็สามารถระบุได้และจะถูกแทรกอย่างถูกต้อง
Augusto Barreto

3
ทำไมConfigureServicesมันเป็นไปไม่ได้?
Alexsandro

2
@Alexsandro_xpt เพื่อจัดทำเอกสารคำตอบสำหรับคำถามของคุณConfigureServicesเป็นไปไม่ได้เนื่องจากกรอบงานไม่รองรับ Dependency Injection สำหรับวิธีการเฉพาะนั้นเหมือนในพื้นที่อื่น ๆ (อาจเป็นเพราะคุณใช้วิธีนี้ในการกำหนดค่าการฉีดแบบพึ่งพา) การตั้งค่าที่ระดับตัวสร้างตามที่โจอธิบายไว้ควรแก้ไขปัญหานี้
Matt Eland

@MarkG น่าเสียดายที่คำตอบถูกลบ ... Q ของมันถูกทำเครื่องหมายว่าซ้ำกับคำถามนี้ รวมไว้ที่นี่ด้วย ...
Richard

31

คัดลอกมาจากคำถามที่มีการทำเครื่องหมายว่าซ้ำกับคนนี้และลบ เครดิตa-ctor .

หากคุณต้องการที่จะเข้าถึงIHostingEnvironmentในConfigureServicesที่คุณจะต้องฉีดผ่านทางสร้างและเก็บไว้สำหรับการเข้าถึงในภายหลัง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
}

สวัสดีครับมันไม่ได้เป็นเรื่องใหญ่ แต่ในสตริงการจัดรูปแบบเป็นกรณีที่ต่ำกว่าในขณะที่คุณสมบัติที่น่าจะเป็นenvironment Environment
timmi4sa

1
@ BenSmith ฉันเชื่อว่าคุณพิมพ์ผิด คุณได้กล่าวย้ำ IHostingEnvironment ในคำแถลงของคุณ "ตอนนี้ IHostingEnvironment ล้าสมัยแล้วและควรใช้ IHostingEnvironment แทนการเปลี่ยน IHostingEnvironment ที่ถูกต้องคืออะไร
Blake

ดู๊! จุดที่ดี @Blake ฉันจะลบความคิดเห็นก่อนหน้านี้ ความคิดเห็นของฉันควรอ่าน "ตอนนี้ IHostingEnvironment ล้าสมัยแล้วควรใช้ IWebHostEnvironment แทน"
Ben Smith

และเพื่อให้ชัดเจนเป็นพิเศษไม่ควรบอกว่าIHostingEnvironmentล้าสมัยแล้ว.Net Core 3.0หรือไม่? (ฉันกำลังดำเนินการ 'ทำแบบทดสอบที่บ้าน' ซึ่งเรียกservices.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);ใช้ConfigureServices()วิธีการนี้และ IHostingEnvironment ทำงานได้ดี
Scott Fraley

@ScottFraley ถูกต้อง เนื่องจากคำถามและคำตอบนี้มาจากกรอบเวลา. NET Core 2.x (ซึ่งโครงการจำนวนมากจะยังคงใช้งานต่อไปอีกระยะหนึ่ง) จึงยังคงมีผลบังคับใช้
Richard

3

IHostingEnvironment เลิกใช้แล้วใน Core 3.1

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

ควรทำเคล็ดลับ ...

จากนั้นอ้างอิงได้ทุกที่ด้วย_env.IsDevelopment()ฯลฯ ...


0

หากคุณไม่ได้ใช้Startupชั้นเรียนและกำลังโทร.Configure()โดยตรงคุณสามารถเข้าถึงIHostingEnvironmentหรือIWebHostEnvironmentใช้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
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.