Der einfachste und korrekteste Weg, dies in allen Versionen von ASP.NET Core zu erreichen , ist die Implementierung der IConfigureOptions<TOptions>
Schnittstelle. Obwohl dies seit .NET Core 1.0 der Fall ist, scheinen nur wenige Menschen zu wissen, wie es die Dinge zu Just Work ™ macht.
Als Beispiel möchten Sie einen benutzerdefinierten Modellvalidator hinzufügen, der von einem der anderen Dienste Ihrer Anwendung abhängig ist. Zunächst scheint es unmöglich - es gibt keine Möglichkeit zur Lösung, IMyServiceDependency
da Sie keinen Zugriff auf Folgendes haben IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Aber die "Magie" von IConfigureOptions<TOptions>
macht es so einfach:
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();
}
Im Wesentlichen wird jedes Setup, das Sie in den Add***(***Options)
Delegaten in vorgenommen haben, ConfigureServices
jetzt in IConfigureOptions<TOptions>
die Configure
Methode Ihrer Klasse verschoben . Dann registrieren Sie die Optionen auf die gleiche Weise, wie Sie jeden anderen Dienst registrieren würden, und los geht's!
Für weitere Details sowie Informationen darüber, wie dies hinter den Kulissen funktioniert, verweise ich Sie auf den immer ausgezeichneten Andrew Locke .