在所有版本的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 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();
}
本质上,您在Add***(***Options)
委托中完成的所有设置ConfigureServices
现在都将移至您IConfigureOptions<TOptions>
班级的Configure
方法中。然后,您可以使用注册其他任何服务的相同方式注册选项,然后离开!
有关更多详细信息以及有关如何在后台进行工作的信息,我将向您推荐始终出色的Andrew Locke。