Najprostszym i najbardziej poprawnym sposobem osiągnięcia tego we wszystkich wersjach ASP.NET Core jest zaimplementowanie IConfigureOptions<TOptions>
interfejsu. Chociaż było to już od .NET Core 1.0, wydaje się, że niewiele osób wie o tym, jak to wszystko działa .
Na przykład chcesz dodać moduł weryfikacji modelu niestandardowego, który jest zależny od jednej z innych usług aplikacji. Początkowo wydaje się to niemożliwe - nie ma sposobu na rozwiązanie, IMyServiceDependency
ponieważ nie masz dostępu do IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Ale „magia” IConfigureOptions<TOptions>
sprawia, że jest to takie proste:
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();
...
services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
}
Zasadniczo każda konfiguracja, którą wykonałeś w Add***(***Options)
delegatach, ConfigureServices
jest teraz przenoszona do metody Twojej IConfigureOptions<TOptions>
klasy Configure
. Następnie rejestrujesz opcje w ten sam sposób, w jaki rejestrujesz każdą inną usługę i gotowe!
Aby uzyskać więcej szczegółów, a także informacje o tym, jak to działa za kulisami, odsyłam do zawsze doskonałego Andrew Lock .