A maneira mais simples e correta de conseguir isso, em todas as versões do ASP.NET Core , é implementar oIConfigureOptions<TOptions>
interface. Embora isso exista desde o .NET Core 1.0, parece que poucas pessoas sabem como ele faz as coisas Just Work ™.
Por exemplo, você deseja adicionar um validador de modelo personalizado que dependa de um dos outros serviços do seu aplicativo. Inicialmente, parece impossível - não há como resolver IMyServiceDependency
porque você não tem acesso a IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Mas a "mágica" de IConfigureOptions<TOptions>
torna isso tão fácil:
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();
}
Essencialmente, qualquer configuração que você teria feito nos Add***(***Options)
delegados ConfigureServices
agora é movida para a sua IConfigureOptions<TOptions>
classeConfigure
método . Então você registra as opções da mesma forma que registraria qualquer outro serviço, e pronto!
Para obter mais detalhes, bem como informações sobre como isso funciona nos bastidores, indico o sempre excelente Andrew Locke .