Le moyen le plus simple et le plus correct d'y parvenir, dans toutes les versions d'ASP.NET Core , consiste à implémenter l' IConfigureOptions<TOptions>
interface. Bien que cela existe depuis .NET Core 1.0, il semble que peu de gens sachent comment les choses fonctionnent Just Work ™ .
Par exemple, vous souhaitez ajouter un validateur de modèle personnalisé qui a une dépendance sur l'un des autres services de votre application. Au départ, cela semble impossible - il n'y a aucun moyen de résoudre IMyServiceDependency
car vous n'avez pas accès à un IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Mais la "magie" du IConfigureOptions<TOptions>
rend les choses si faciles:
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>();
}
Essentiellement, toute configuration que vous auriez effectuée dans les Add***(***Options)
délégués ConfigureServices
est maintenant déplacée vers IConfigureOptions<TOptions>
la Configure
méthode de votre classe . Ensuite, vous enregistrez les options de la même manière que vous enregistrez n'importe quel autre service, et c'est parti!
Pour plus de détails, ainsi que des informations sur la façon dont cela fonctionne dans les coulisses, je vous renvoie au toujours excellent Andrew Lock .