ASP.NET Core 依存関係の挿入: IServiceCollection 外部のサービスへのアクセス
ASP.NET Core では、IServiceCollection
は依存関係注入 (DI) システム内に依存関係を登録するために重要です。 ただし、標準のインジェクションをバイパスして、サービスを直接解決する必要がある状況が発生する可能性があります。
IServiceCollection からサービスに直接アクセスする
IServiceCollection
自体はサービス解決を提供しません。その目的は、DI コンテナを構成することだけです。 構成が完了すると、このコンテナは IServiceProvider
.
ServiceProvider の挿入
手動でサービスを解決するには、IServiceProvider
をクラスに挿入します。 IApplicationBuilder
と HttpContext
は両方とも、それぞれ ApplicationServices
と RequestServices
プロパティを介してアクセスを提供します。
サービスプロバイダーの利用
IServiceProvider
は、タイプに基づいてサービスを取得するための GetService(Type type)
を提供します。 便宜上、GetService<TService>()
のような拡張メソッドを使用します (using Microsoft.Extensions.DependencyInjection;
が必要です)。
スタートアップ クラス内のサービス解決
起動時の依存関係の挿入
Startup
クラスは、IConfiguration
や IWebHostEnvironment
(または 3.0 より前のバージョンでは IHostingEnvironment
) など、コンストラクターで挿入された依存関係を受け入れることができます。
ConfigureServices()
内で、これらの挿入されたサービスを利用して、さらに依存関係を登録します。
起動時の依存関係の手動解決
内でサービス ConfigureServices()
を解決するには、IServiceProvider
から中間 IServiceCollection
を作成します。これにより、それまでに登録されたサービスにアクセスできるようになります。
ApplicationServices の活用
Configure()
メソッドでは、IApplicationBuilder.ApplicationServices
を使用してサービスを解決します。これにより、アプリケーション用に構成されたサービスにアクセスします。
サービス ロケーターのアンチパターンの回避
サービスの直接解決は、「Service Locator」アンチパターンに該当するため、一般的に推奨されません。必要な場合もありますが、コンストラクター インジェクションを優先して可能な限り回避する必要があります。
以上がIServiceCollection を超えて ASP.NET Core DI のサービスを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。