Il modo più semplice e corretto per ottenere ciò, in tutte le versioni di ASP.NET Core , è implementare l' IConfigureOptions<TOptions>
interfaccia. Sebbene questo sia in circolazione da .NET Core 1.0, sembra che poche persone sappiano come fa le cose Just Work ™.
Ad esempio, si desidera aggiungere un validatore di modelli personalizzato che abbia una dipendenza da uno degli altri servizi dell'applicazione. Inizialmente sembra impossibile: non c'è modo di risolvere IMyServiceDependency
perché non hai accesso a un IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Ma la "magia" di IConfigureOptions<TOptions>
rende tutto così facile:
public class MyMvcOptions : 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)
{
// or scoped, or transient
services.AddSingleton<IConfigureOptions<MvcOptions>, MyMvcOptions>();
services.AddControllers();
}
In sostanza, qualsiasi configurazione che avresti fatto nei Add***(***Options)
delegati in ConfigureServices
viene ora spostata nel metodo IConfigureOptions<TOptions>
della tua classe Configure
. Quindi registri le opzioni nello stesso modo in cui registri qualsiasi altro servizio e via!
Per maggiori dettagli, oltre che per informazioni su come funziona dietro le quinte, vi rimando al sempre eccellente Andrew Locke .