このIServiceCollectionインターフェースは、依存関係注入コンテナーを作成するために使用されます。完全にビルドされると、IServiceProviderサービスの解決に使用できるインスタンスに構成されます。IServiceProviderを任意のクラスに注入できます。IApplicationBuilderそしてHttpContextクラスはその経て、同様のサービスプロバイダを提供することができApplicationServicesたりRequestServices、それぞれの特性。
IServiceProviderGetService(Type type)サービスを解決するメソッドを定義します。
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
serviceProvider.GetService<IFooService>()(add a usingfor Microsoft.Extensions.DependencyInjection)などの便利な拡張メソッドもいくつかあります。
スタートアップクラス内のサービスの解決
依存関係の注入
ランタイムのホスティングサービスプロバイダは、のコンストラクタに特定のサービスを注入できるStartupよう、クラスIConfiguration、
IWebHostEnvironment(IHostingEnvironment前の3.0バージョンでは)、ILoggerFactoryおよびIServiceProvider。後者はホスティング層によって構築されたインスタンスであり、アプリケーションの起動に必要なサービスのみが含まれていることに注意してください。
このConfigureServices()メソッドはサービスの注入を許可していませんIServiceCollection。引数を受け入れるだけです。これはConfigureServices()、アプリケーションで必要なサービスを登録する場所だからです。ただし、ここではスタートアップのコンストラクターに注入されたサービスを使用できます。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Use Configuration here
}
ConfigureServices()次に、登録されているサービスをConfigure()メソッドに注入できます。IApplicationBuilderパラメータの後に任意の数のサービスを追加できます。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IFooService>();
}
public void Configure(IApplicationBuilder app, IFooService fooService)
{
fooService.Bar();
}
依存関係を手動で解決する
サービスを手動で解決する必要がある場合は、メソッドでApplicationServices提供さIApplicationBuilderれているを使用することをお勧めしますConfigure()。
public void Configure(IApplicationBuilder app)
{
var serviceProvider = app.ApplicationServices;
var hostingEnv = serviceProvider.GetService<IHostingEnvironment>();
}
クラスIServiceProviderのコンストラクターでを渡して直接使用することは可能ですStartupが、上記のように、これにはサービスの限られたサブセットが含まれるため、ユーティリティが制限されます。
public Startup(IServiceProvider serviceProvider)
{
var hostingEnv = serviceProvider.GetService<IWebHostEnvironment>();
}
ConfigureServices()メソッドでサービスを解決する必要がある場合は、別のアプローチが必要です。その時点までに登録されているサービスを含むインスタンスIServiceProviderから中間体を構築できIServiceCollectionます。
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFooService, FooService>();
// Build the intermediate service provider
var sp = services.BuildServiceProvider();
// This will succeed.
var fooService = sp.GetService<IFooService>();
// This will fail (return null), as IBarService hasn't been registered yet.
var barService = sp.GetService<IBarService>();
}
注:ConfigureServices()これは実際にはアプリケーションサービスを構成する場所である
ため、通常、メソッド内のサービスの解決は避けてください。場合によっては、IOptions<MyOptions>インスタンスへのアクセスが必要なだけです。これを実現するには、IConfigurationインスタンスの値をインスタンスのインスタンスにバインドしますMyOptions(これは、基本的にオプションフレームワークが行うことです)。
public void ConfigureServices(IServiceCollection services)
{
var myOptions = new MyOptions();
Configuration.GetSection("SomeSection").Bind(myOptions);
}
手動でサービスを解決すること(別名Service Locator)は、一般的にアンチパターンと見なされます。(フレームワークやインフラストラクチャ層の)ユースケースはありますが、できる限り回避する必要があります。