ASP.NET Core MVC のDIコンテナを利用する Part.2(オブジェクトライフサイクル)

前回までのあらすじ

DIコンテナを
使ったよ

mrgchr.hatenablog.com

オブジェクトライフサイクルについて

前回AddTransientを利用した例では、Dependencyが要求されるごとに新しいインスタンスが生成されていました。
これらのオブジェクトのライフサイクルは、ConfigureServicesにてどのような登録メソッドを利用するかによって決まります。

メソッド名 説明
AddTransient Dependencyが要求されるごとに新しいインスタンスを作成する
AddScoped Webリクエストごとに新しいインスタンスを作成する
AddSigleton アプリケーションにて共有のシングルトンインスタンスを作成する

AddTransient

AddScoped メソッドは、DIコンテナにTransientライフサイクルにてオブジェクトを登録します。
Transientライフサイクルでは、Dependencyが要求されるごとに新しいDependencyインスタンスが生成されます。

画像は前回のものですが、Dependencyを受け取る箇所毎にインスタンスが生成されています。

f:id:mrgchr:20161021002824p:plain

AddScoped

AddScoped メソッドは、DIコンテナにScopedライフサイクルにてオブジェクトを登録します。
Scopedライフサイクルでは、HTTPリクエスト毎にDependencyインスタンスを一つ生成します。
リクエストの間はそのインスタンスが共有されます。

次の画像ではHTTPリクエスト毎に新しいインスタンスが生成されていて、リクエスト間では一つのインスタンスが共有されています。

f:id:mrgchr:20161021235808p:plain

AddSingleton

AddSingletonメソッドは、DIコンテナにSingletonライフサイクルにてオブジェクトを登録します。
Singletonライフサイクルでは、Dependencyインスタンスを一つ生成し、そのインスタンスをアプリケーションで共有します。

次の画像ではそれぞれのHTTPリクエストにおいても、一つのインスタンスが共有されています。

f:id:mrgchr:20161021235831p:plain

サンプルアプリでのサービスとライフタイム

ASP.NET Core MVC のサンプルアプリ初期状態にて、ConfigureService呼び出し時に登録されているサービスとそのライフサイクルを調べて最初の10件をリストにしました。

これを見るとSingletonとTransientが多いですね。

Lifetime ServiceType ImplementationInstance ImplementationType
Singleton Microsoft.AspNetCore.Hosting.IHostingEnvironment Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment
Singleton Microsoft.Extensions.Logging.ILoggerFactory Microsoft.Extensions.Logging.LoggerFactory
Singleton Microsoft.Extensions.Logging.ILogger`1[TCategoryName] Microsoft.Extensions.Logging.Logger`1[T]
Transient Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory Microsoft.AspNetCore.Hosting.Builder.ApplicationBuilderFactory
Transient Microsoft.AspNetCore.Http.IHttpContextFactory Microsoft.AspNetCore.Http.HttpContextFactory
Singleton Microsoft.Extensions.Options.IOptions`1[TOptions] Microsoft.Extensions.Options.OptionsManager`1[TOptions]
Singleton System.Diagnostics.DiagnosticSource Microsoft.AspNetCore
Singleton System.Diagnostics.DiagnosticListener Microsoft.AspNetCore
Transient Microsoft.AspNetCore.Hosting.IStartupFilter Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter
Singleton Microsoft.Extensions.ObjectPool.ObjectPoolProvider Microsoft.Extensions.ObjectPool.DefaultObjectPoolProvider

まとめ

DIコンテナのライフサイクルと、サンプルの初期の登録されているサービスを調べました。