ASP.NET Coreのすべてのバージョンでこれを実現する最も簡単で最も正しい方法は、IConfigureOptions<TOptions>
インターフェイスを実装することです。これは.NET Core 1.0から存在しますが、Just Work™の仕組みについて知っている人はほとんどいないようです。
例として、アプリケーションの他のサービスの1つに依存するカスタムモデルバリデーターを追加するとします。最初は不可能のようです-に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を紹介します。