반응형
서비스의 수명은 종속성이 인스턴스화되는 시기와 수명에 따라 다르며 수명은 이러한 서비스를 등록한 방법에 따라 달라집니다.
아래 세 가지 방법은 서비스의 수명을 정의합니다.
- AddTransient
Transient 는 서비스가 요청될 때마다 새롭게 생성됩니다. - AddScoped
Scoped 서비스는 요청당 한 번 생성됩니다. 연결이 유지되는동안 재사용합니다. - AddSingleton
Singleton 서비스는 처음 요청될 때 생성되며 이후의 모든 요청은 동일한 인스턴스를 사용합니다.
예제를 통해서 서비스의 수명주기를 알아보기 위한 테스트는 WebAPI 프로젝트로 진행합니다.
서비스 생성
1. 테스트에서 사용할 Singleton, Scoped, Transient 3개의 인터페이스와 구현 클래스를 생성합니다.
// Singleton Service
namespace WebAPISampleNet5.Services
{
public interface IServiceSingleton
{
}
public class ServiceSingleton : IServiceSingleton
{
}
}
// Scoped Service
namespace WebAPISampleNet5.Services
{
public interface IServiceScoped
{
}
public class ServiceScoped : IServiceScoped
{
}
}
// Transient Service
namespace WebAPISampleNet5.Services
{
public interface IServiceTransient
{
}
public class ServiceTransient : IServiceTransient
{
}
}
2. 테스트를 위해 생성한 서비스를 의존성을 주입합니다.
//Startup.cs
services.AddSingleton<IServiceSingleton, ServiceSingleton>();
services.AddScoped<IServiceScoped, ServiceScoped>();
services.AddTransient<IServiceTransient, ServiceTransient>();
3. 테스트를 위한 Controller 를 생성합니다.
namespace WebAPISampleNet5.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ServiceController : ControllerBase
{
// 각각의 서비스 객체를 생성
private IServiceSingleton _singleton;
private IServiceScoped _scoped1;
private IServiceScoped _scoped2;
private IServiceTransient _transient1;
private IServiceTransient _transient2;
public ServiceController(IServiceSingleton single,
IServiceScoped scoped1, IServiceScoped scoped2,
IServiceTransient tran1, IServiceTransient tran2)
{
_singleton = single;
_scoped1 = scoped1;
_scoped2 = scoped2;
_transient1 = tran1;
_transient2 = tran2;
}
// get 메서드를 통해 해당 서비스의 해쉬값을 확인
[HttpGet]
public IActionResult Get()
{
var data = new
{
single = _singleton.GetHashCode(),
scoped1 = _scoped1.GetHashCode(),
scoped2 = _scoped2.GetHashCode(),
transient1 = _transient1.GetHashCode(),
transient2 = _transient2.GetHashCode(),
};
return Ok(data);
}
}
}
API 를 호출 하면서 결과 확인하면
SIngleton, Scoped, Transient 에 따라서 생성되는 인스턴스 의 해쉬값을 확인할수 있습니다.
- Transient 동일한 요청이더라도 항상 새 인스턴스를 반환하므로 두 요청(요청 1 및 요청 2)의 인스턴스가 다릅니다.
- Scoped 요청당 하나의 인스턴스가 생성되고 동일한 인스턴스가 요청 간에 공유되나, 새로운 요청(새로고침) 등에서는 다른 인스턴스가 생성됩니다.
- Singleton 하나의 인스턴스만 생성되어 여러 애플리케이션에서 공유되기떄문에 새로고침을 하거나 다른 어플리케이션에서 접속을 해도 인스턴스가 동일합니다.
반응형
'dev > asp.net, c#' 카테고리의 다른 글
[c#] System.Text.Json 네임스페이스 - JSON Object, Serialize, Deserialize (0) | 2022.11.29 |
---|---|
[c#] 10진수를 X진수 또는 X진수를 10진수 변환 하기(X to Y 진수 변환), 2진수, 8진수, 16진수 진법 변환 (0) | 2022.11.25 |
[c#] 파일, 디렉토리 (File, Directory) - System.IO.File, System.IO.Directory (0) | 2022.11.22 |
[.NET 6.0] WebAPI - Request.Body 데이터 수신 (IFormFile 파일,[FromBody] string) (0) | 2022.11.21 |
[c#] Dictionary 와 LookUp 차이점 (0) | 2022.11.17 |