วิธีที่ง่ายและถูกต้องที่สุดในการดำเนินการนี้ใน 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 ที่ยอดเยี่ยมเสมอ