using Microsoft.Extensions.DependencyInjection;
public static IServiceProvider serviceProvider;
public static void Configure()
var instance = new DefinedValuedServiceClass{Value = 10};
serviceProvider = new ServiceCollection()
.AddSingleton<IDemoService, DemoService>()
.AddSingleton<ITestService, MyTestService>()
.AddTransient<TransientOperation>()
.AddScoped<ScopedOperation>()
.AddSingleton<SingletonOperation>()
.AddTransient(typeof(GenericRepository<>))
.AddSingleton<IService, ServiceA>()
.AddSingleton<IService, ServiceB>()
public static void Main()
Console.WriteLine("Initiating Service Operations");
Console.WriteLine("\n-------- First Request --------");
using (IServiceScope scope = serviceProvider.CreateScope())
var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();
var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();
var transientService = scope.ServiceProvider.GetService<TransientOperation>();
var test = serviceProvider.GetService<ITestService>();
var myReturnedInstance = serviceProvider.GetService<DefinedValuedServiceClass>();
Console.WriteLine($"Initialized valued on service was: {myReturnedInstance.Value} ");
var genericClientService = (GenericRepository<Client>)serviceProvider.GetService(typeof(GenericRepository<Client>));
var client = new Client{name = "Camilo"};
genericClientService.Add(client);
var multipleServices = serviceProvider.GetServices<IService>();
var lastAddedService = serviceProvider.GetService<IService>();
foreach (var service in multipleServices)
Console.WriteLine(service.SaySomething());
Console.WriteLine(lastAddedService.SaySomething());
Console.WriteLine("\n-------- Second Request --------");
using (var scope = serviceProvider.CreateScope())
var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();
var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();
var transientService = scope.ServiceProvider.GetService<TransientOperation>();
Console.WriteLine(new String('-', 30));
Console.WriteLine("Operations Concluded!");
public interface IDemoService { void ServiceDemo(int number); }
public interface ITestService { void TestService(); }
public class DemoService : IDemoService
public void ServiceDemo(int number) => Console.WriteLine($"Executing DemoService Operation number: {number} ");
public class MyTestService : ITestService
private readonly IDemoService _demoService;
public MyTestService(IDemoService demoService)
_demoService = demoService;
public void TestService()
for (int i = 0; i <= 1; i++)
_demoService.ServiceDemo(i);
public class SingletonOperation : IDisposable
private bool _disposed = false;
public SingletonOperation() => Console.WriteLine("Singleton Service created!");
Console.WriteLine("SingletonService Disposed!");
~SingletonOperation() => Dispose();
public class ScopedOperation : IDisposable
private bool _disposed = false;
public ScopedOperation() => Console.WriteLine("Scoped Service created!");
Console.WriteLine("ScopedService Disposed!");
~ScopedOperation() => Dispose();
public class TransientOperation : IDisposable
private bool _disposed = false;
public TransientOperation() => Console.WriteLine("Transient Service created!");
Console.WriteLine("TransientService Disposed!");
~TransientOperation() => Dispose();
public class DefinedValuedServiceClass { public int Value { get; set; } }
public class GenericRepository<T> { public void Add(T obj) => Console.WriteLine($"Adding object of type {obj.GetType()}"); }
public interface IService { public string SaySomething(); }
public class ServiceA : IService { public string SaySomething() => "I am Service A"; }
public class ServiceB : IService { public string SaySomething() => "I am Service B"; }
public class Client { public string name { get; set; } }