Cara termudah dan paling benar untuk mencapai ini, di semua versi ASP.NET Core , adalah dengan mengimplementasikan IConfigureOptions<TOptions>
antarmuka. Meskipun ini telah ada sejak .NET Core 1.0, tampaknya hanya sedikit orang yang tahu tentang cara membuat Just Work ™ .
Misalnya, Anda ingin menambahkan validator model kustom yang memiliki ketergantungan pada salah satu layanan aplikasi Anda yang lain. Awalnya tampaknya tidak mungkin - tidak ada cara untuk menyelesaikannya IMyServiceDependency
karena Anda tidak memiliki akses ke IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Tapi "keajaiban" IConfigureOptions<TOptions>
membuatnya begitu mudah:
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();
...
// or scoped, or transient, as necessary for your service
services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
}
Pada dasarnya, penyiapan apa pun yang seharusnya Anda lakukan di dalam Add***(***Options)
delegasi ConfigureServices
sekarang dipindahkan ke metode IConfigureOptions<TOptions>
kelas Anda Configure
. Kemudian Anda mendaftarkan opsi dengan cara yang sama seperti Anda mendaftarkan layanan lain, dan Anda pergi!
Untuk detail lebih lanjut, serta informasi tentang cara kerjanya di balik layar, saya merujuk Anda ke Andrew Lock yang selalu luar biasa .