La forma más sencilla y correcta de lograr esto, en todas las versiones de ASP.NET Core , es implementar la IConfigureOptions<TOptions>
interfaz. Si bien esto ha existido desde .NET Core 1.0, parece que pocas personas saben cómo hace que las cosas funcionen simplemente .
Como ejemplo, desea agregar un validador de modelo personalizado que dependa de uno de los otros servicios de su aplicación. Inicialmente parece imposible; no hay forma de resolverlo IMyServiceDependency
porque no tiene acceso a un IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Pero la "magia" de lo IConfigureOptions<TOptions>
hace tan fácil:
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>();
}
Esencialmente, cualquier configuración que hubiera hecho en los Add***(***Options)
delegados ConfigureServices
ahora se mueve al método de su IConfigureOptions<TOptions>
clase Configure
. Luego registra las opciones de la misma manera que registraría cualquier otro servicio, ¡y listo!
Para obtener más detalles, así como información sobre cómo funciona esto detrás de escena, lo remito al siempre excelente Andrew Lock .