TL; DR
非定常オブジェクトは常に異なります。すべてのコントローラーとすべてのサービスに新しいインスタンスが提供されます。
スコープ付きオブジェクトはリクエスト内では同じですが、リクエストごとに異なります。
シングルトンオブジェクトは、すべてのオブジェクトとすべてのリクエストで同じです。
より明確にするために、ASP.NETドキュメントの次の例は違いを示しています。
これらの有効期間と登録オプションの違いを示すために、1つ以上のタスクを一意の識別子を持つ操作として表す単純なインターフェースを考えてみましょうOperationId
。このサービスの有効期間の構成方法に応じて、コンテナーはサービスの同じまたは異なるインスタンスを要求クラスに提供します。要求されているライフタイムを明確にするために、ライフタイムオプションごとに1つのタイプを作成します。
using System;
namespace DependencyInjectionSample.Interfaces
{
public interface IOperation
{
Guid OperationId { get; }
}
public interface IOperationTransient : IOperation
{
}
public interface IOperationScoped : IOperation
{
}
public interface IOperationSingleton : IOperation
{
}
public interface IOperationSingletonInstance : IOperation
{
}
}
これらのインターフェースOperation
は、コンストラクターでGUIDを受け入れる単一のクラスを使用して実装するか、提供されていない場合は新しいGUIDを使用します。
using System;
using DependencyInjectionSample.Interfaces;
namespace DependencyInjectionSample.Classes
{
public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
{
Guid _guid;
public Operation() : this(Guid.NewGuid())
{
}
public Operation(Guid guid)
{
_guid = guid;
}
public Guid OperationId => _guid;
}
}
次に、ではConfigureServices
、名前付きの有効期間に従って各タイプがコンテナに追加されます。
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
services.AddTransient<OperationService, OperationService>();
なお、IOperationSingletonInstance
サービスが既知のIDで特定のインスタンスを使用してGuid.Empty
、このタイプが使用されるとき、それは明らかであろうように、。OperationService
他の各Operation
タイプに依存するも登録しました。これにより、リクエスト内で、このサービスがコントローラーと同じインスタンスを取得しているか、各オペレーションタイプに対して新しいインスタンスを取得しているかが明確になります。このサービスが行うのは、依存関係をプロパティとして公開することだけなので、ビューに表示できます。
using DependencyInjectionSample.Interfaces;
namespace DependencyInjectionSample.Services
{
public class OperationService
{
public IOperationTransient TransientOperation { get; }
public IOperationScoped ScopedOperation { get; }
public IOperationSingleton SingletonOperation { get; }
public IOperationSingletonInstance SingletonInstanceOperation { get; }
public OperationService(IOperationTransient transientOperation,
IOperationScoped scopedOperation,
IOperationSingleton singletonOperation,
IOperationSingletonInstance instanceOperation)
{
TransientOperation = transientOperation;
ScopedOperation = scopedOperation;
SingletonOperation = singletonOperation;
SingletonInstanceOperation = instanceOperation;
}
}
}
アプリケーションへの個別の個別リクエスト内および個別リクエスト間のオブジェクトライフタイムを示すために、サンプルには、OperationsController
各タイプのIOperation
タイプとをリクエストするが含まれていますOperationService
。次に、Index
アクションはすべてのコントローラーとサービスのOperationId
値を表示します。
using DependencyInjectionSample.Interfaces;
using DependencyInjectionSample.Services;
using Microsoft.AspNetCore.Mvc;
namespace DependencyInjectionSample.Controllers
{
public class OperationsController : Controller
{
private readonly OperationService _operationService;
private readonly IOperationTransient _transientOperation;
private readonly IOperationScoped _scopedOperation;
private readonly IOperationSingleton _singletonOperation;
private readonly IOperationSingletonInstance _singletonInstanceOperation;
public OperationsController(OperationService operationService,
IOperationTransient transientOperation,
IOperationScoped scopedOperation,
IOperationSingleton singletonOperation,
IOperationSingletonInstance singletonInstanceOperation)
{
_operationService = operationService;
_transientOperation = transientOperation;
_scopedOperation = scopedOperation;
_singletonOperation = singletonOperation;
_singletonInstanceOperation = singletonInstanceOperation;
}
public IActionResult Index()
{
// ViewBag contains controller-requested services
ViewBag.Transient = _transientOperation;
ViewBag.Scoped = _scopedOperation;
ViewBag.Singleton = _singletonOperation;
ViewBag.SingletonInstance = _singletonInstanceOperation;
// Operation service has its own requested services
ViewBag.Service = _operationService;
return View();
}
}
}
ここで、このコントローラーアクションに対して2つの個別のリクエストが行われます。
OperationId
リクエスト内およびリクエスト間で変化する値を確認します。
非定常オブジェクトは常に異なります。すべてのコントローラーとすべてのサービスに新しいインスタンスが提供されます。
スコープ付きオブジェクトはリクエスト内では同じですが、リクエストごとに異なります
シングルトンオブジェクトは、すべてのオブジェクトとすべてのリクエストで同じです(インスタンスがで提供されているかどうかに関係なくConfigureServices
)