using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
public static void Main()
ServiceCollection services = new ServiceCollection();
ServiceResolver.Register<ServiceA>();
ServiceResolver.Register<ServiceB>();
services.AddSingleton<IDependencyB, DependencyB>();
services.AddSingleton<IServiceResolver, ServiceResolver>();
IServiceProvider provider = services.BuildServiceProvider();
IServiceResolver resolver = provider.GetRequiredService<IServiceResolver>();
foreach(IService service in resolver.GetServices())
provider.GetRequiredService<IService>();
public class ServiceResolver : IServiceResolver
public static void Register<TService>() where TService : IService
ServiceTypes.Add(typeof(TService));
public ServiceResolver(IServiceProvider serviceProvider)
_serviceProvider = serviceProvider;
public IEnumerable<IService> GetServices()
return ServiceTypes.Select(t => ActivatorUtilities.CreateInstance(_serviceProvider, t) as IService);
private static List<Type> ServiceTypes = new List<Type>();
private readonly IServiceProvider _serviceProvider;
public interface IServiceResolver
public IEnumerable<IService> GetServices();
public interface IService
public class ServiceA : IService
public void Test() => Console.WriteLine("I am service A!");
public class ServiceB : IService
public ServiceB(IDependencyB dependency)
_dependency = dependency;
public void Test() => Console.WriteLine("I am service B! I have dependency {0}", _dependency.GetType());
private readonly IDependencyB _dependency;
public interface IDependencyB {}
public class DependencyB : IDependencyB{}