Last time I checked the lifetimes of different types of services and want to share with you my findings.
Application
Having such controller:
[ApiController] [Route("[controller]")] public class FooController : ControllerBase { private ISingletonService _singleton1; private ISingletonService _singleton2; private IScopedService _scoped1; private IScopedService _scoped2; private ITransientService _transient1; private ITransientService _transient2; public FooController( ISingletonService singleton1, ISingletonService singleton2, IScopedService scoped1, IScopedService scoped2, ITransientService transient1, ITransientService transient2) { _singleton1 = singleton1; _singleton2 = singleton2; _scoped1 = scoped1; _scoped2 = scoped2; _transient1 = transient1; _transient2 = transient2; } [HttpGet] [Route("Singleton")] public List<string> Singleton() { return new List<string> { _singleton1.GetGuid(), _singleton2.GetGuid() }; } [HttpGet] [Route("Scoped")] public List<string> Scoped() { return new List<string> { _scoped1.GetGuid(), _scoped2.GetGuid() }; } [HttpGet] [Route("Transient")] public List<string> Transient() { return new List<string> { _transient1.GetGuid(), _transient2.GetGuid() }; } }
and such startup (full repo address in the end of post)
public void ConfigureServices(IServiceCollection services) { services.AddTransient<ITransientService, TransientService>(); services.AddScoped<IScopedService, ScopedService>(); services.AddSingleton<ISingletonService, SingletonService>(); services.AddControllers(); }
I queried each endpoint (singleton, scoped, transient) two times. Here are the results:
Singleton
first request
second request
Conclusion
- doesn’t matter how many times you request endpoint. There is only one instance.
Singleton service is created
- first time they’re requested and is not destroyed
- by developer
When useful?
- caching
- configuration
- global rules
Scoped
first request
second request
Conclusion:
- each request generates new Guid
- same instance is shared in the boundary of single request
each time you access the page the service is createdwhen useful?
- persist state throughout application per request
Transient
first request
second request
Conclusion
- each request generates new Guids
- new Guid (new instance) of service is created on each access to instance
Transient service is created
- each time they’re requested from the service container
When useful?
- weightless stateless services
Link to the repo: https://github.com/simplyaboutcode/ServiceLifetime