Самый простой и правильный способ добиться этого во всех версиях ASP.NET Core - реализовать IConfigureOptions<TOptions>
интерфейс. Хотя это существует с .NET Core 1.0, кажется, что мало кто знает, как это делает вещи Just Work ™ .
В качестве примера вы хотите добавить настраиваемый валидатор модели, который зависит от одной из других служб вашего приложения. Первоначально это кажется невозможным - нет способа решить, IMyServiceDependency
потому что у вас нет доступа к IServiceProvider
:
public class MyModelValidatorProvider : IModelValidatorProvider
{
public MyModelValidatorProvider(IMyServiceDependency dependency)
{
...
}
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.ModelValidatorProviders.Add(new MyModelValidatorProvider(??????));
});
}
Но «волшебство» IConfigureOptions<TOptions>
делает это так просто:
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>();
}
По сути, любая настройка, которую вы сделали бы в Add***(***Options)
делегатах, ConfigureServices
теперь перемещается в метод вашего IConfigureOptions<TOptions>
класса Configure
. Затем вы регистрируете параметры так же, как и любую другую службу, и готово!
Для получения более подробной информации, а также информации о том, как это работает за кулисами, я отсылаю вас к всегда превосходному Эндрю Локку .