TL; DR
일시적인 객체는 항상 다릅니다. 모든 컨트롤러와 모든 서비스에 새로운 인스턴스가 제공됩니다.
범위가 지정된 개체는 요청 내에서는 동일하지만 요청마다 다릅니다.
싱글 톤 객체는 모든 객체와 모든 요청에 대해 동일합니다.
더 명확히하기 위해이 예제는 ASP.NET 설명서 는 다음과 같은 차이점을 보여줍니다.
이러한 수명과 등록 옵션의 차이점을 설명하려면 하나 이상의 작업을 고유 식별자를 가진 작업으로 나타내는 간단한 인터페이스를 고려하십시오 OperationId
. 이 서비스의 수명을 구성하는 방법에 따라 컨테이너는 서비스의 동일하거나 다른 서비스 인스턴스를 요청 클래스에 제공합니다. 어떤 수명이 요청되고 있는지 명확히하기 위해 수명 옵션 당 하나의 유형을 만듭니다.
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();
}
}
}
이제이 제어기 조치에 대해 두 개의 개별 요청이 작성됩니다.
OperationId
요청 내에서 그리고 요청간에 어떤 값이 달라지는 지 확인 하십시오 .
일시적인 객체는 항상 다릅니다. 모든 컨트롤러와 모든 서비스에 새로운 인스턴스가 제공됩니다.
범위가 지정된 객체는 요청 내에서는 동일하지만 요청마다 다릅니다.
싱글 개체 (무관 인스턴스가 설치되어 있는지의 각 개체마다 요청에 대해 동일하다 ConfigureServices
)