.NET

Dependency Injection

サービスのライフタイム(singleton、scoped、transient)、サービス登録、IServiceProvider、ベストプラクティス

24 面接問題·
Mid-Level
1

Singleton、Scoped、Transient のライフタイムの主な違いは何ですか?

回答

Singleton はアプリケーションのライフタイム全体で単一のインスタンスを作成し、Scoped は HTTP リクエスト(またはスコープ)ごとに1つのインスタンスを作成し、Transient はインジェクションのたびに新しいインスタンスを作成します。これらのライフタイムは、DI コンテナがサービスをいつ、何回インスタンス化するかを決定します。状態を持たない共有サービスには Singleton、リクエストにバインドされたサービス(DbContext など)には Scoped、状態を持たない軽量なサービスには Transient を使用します。

2

Entity Framework Core の DbContext を登録するには、どの lifetime を使用すべきですか?

回答

DbContext は thread-safe ではなく、エンティティのトラッキング状態を保持するため、Scoped lifetime で登録すべきです。並行性の問題を避けるため、各 HTTP リクエストは独自の DbContext インスタンスを持つ必要があります。登録は AddDbContext で行い、これが自動的に Scoped lifetime を構成します。Singleton を使用すると並行性エラーが発生し、Transient はインスタンスを作りすぎてリソースを浪費します。

3

interface とその実装を使ってサービスを登録するにはどうすればよいですか?

回答

サービスの登録は AddSingleton、AddScoped、AddTransient メソッドを使い、interface をサービス型として、具象クラスを実装として指定して行います。構文は services.Add{Lifetime}<IInterface, Implementation>() です。このアプローチは依存性逆転の原則を尊重し、実装の差し替えを可能にすることでテストを容易にします。DI コンテナは interface を注入する際に具象実装を自動的に解決します。

4

AddScoped よりも AddSingleton を選ぶべきなのはどのような場合ですか?

5

DI システムにおける IServiceProvider の役割は何ですか?

+21 面接問題

次の面接に向けて.NETをマスター

すべての問題、flashcards、技術テスト、コードレビュー演習、面接シミュレーターにアクセス。

無料で始める