วิธีที่ง่ายและถูกต้องที่สุดในการดำเนินการนี้ใน ASP.NET Core ทุกเวอร์ชันคือการติดตั้งIConfigureOptions<TOptions>
อินเทอร์เฟซ แม้ว่าสิ่งนี้จะมีมาตั้งแต่. NET Core 1.0 แต่ดูเหมือนว่ามีเพียงไม่กี่คนที่รู้ว่ามันทำให้ Just Work ™เป็นอย่างไร
ตัวอย่างเช่นคุณต้องการเพิ่มเครื่องมือตรวจสอบโมเดลที่กำหนดเองซึ่งมีการพึ่งพาบริการอื่น ๆ ของแอปพลิเคชันของคุณ ในตอนแรกดูเหมือนจะเป็นไปไม่ได้ - ไม่มีวิธีแก้ไขIMyServiceDependency
เนื่องจากคุณไม่สามารถเข้าถึงIServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
แต่ "เวทมนตร์" ของIConfigureOptions<TOptions>
มันทำให้ง่ายมาก:
public class ConfigureMvcOptions : IConfigureOptions<MvcOptions>
{
private IMyServiceDependency _dependency;
public MyMvcOptions(IMyServiceDependency dependency)
=> _dependency = dependency;
public void Configure(MvcOptions options)
=> options.ModelValidatorProviders.Add(new MyModelValidatorProvider(_dependency));
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
...
services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
}
โดยพื้นฐานแล้วการตั้งค่าใด ๆ ที่คุณเคยทำในAdd***(***Options)
ผู้รับมอบสิทธิ์ConfigureServices
จะถูกย้ายไปที่เมธอดIConfigureOptions<TOptions>
ของชั้นเรียน Configure
จากนั้นคุณลงทะเบียนตัวเลือกด้วยวิธีเดียวกับที่คุณลงทะเบียนบริการอื่น ๆ และไปเลย!
สำหรับรายละเอียดเพิ่มเติมรวมถึงข้อมูลเกี่ยวกับวิธีการทำงานเบื้องหลังฉันขอแนะนำให้คุณรู้จักกับ Andrew Lock ที่ยอดเยี่ยมเสมอ