Найпростіший і правильний спосіб досягти цього у всіх версіях ASP.NET Core - це реалізація IConfigureOptions<TOptions>
інтерфейсу. Хоча це існує з .NET Core 1.0, здається, мало хто знає про те, як це робить речі просто робочими .
Як приклад, ви хочете додати власний валідатор моделі, який залежить від однієї з інших служб вашої програми. Спочатку це здається неможливим - неможливо вирішити проблему, 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();
...
// or scoped, or transient, as necessary for your service
services.AddSingleton<IConfigureOptions<MvcOptions>, ConfigureMvcOptions>();
}
По суті, будь-яке налаштування, яке ви зробили б для Add***(***Options)
делегатів ConfigureServices
, тепер перенесено до методу вашого IConfigureOptions<TOptions>
класу Configure
. Потім ви реєструєте варіанти так само, як і будь-яку іншу послугу, і геть геть!
Більш детально, а також інформацію про те, як це працює за лаштунками, я посилаюся на завжди чудового Ендрю Лока .