このIServiceCollection
インターフェースは、依存関係注入コンテナーを作成するために使用されます。完全にビルドされると、IServiceProvider
サービスの解決に使用できるインスタンスに構成されます。IServiceProvider
を任意のクラスに注入できます。IApplicationBuilder
そしてHttpContext
クラスはその経て、同様のサービスプロバイダを提供することができApplicationServices
たりRequestServices
、それぞれの特性。
IServiceProvider
GetService(Type type)
サービスを解決するメソッドを定義します。
var service = (IFooService)serviceProvider.GetService(typeof(IFooService));
serviceProvider.GetService<IFooService>()
(add a using
for 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)は、一般的にアンチパターンと見なされます。(フレームワークやインフラストラクチャ層の)ユースケースはありますが、できる限り回避する必要があります。