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>();
public class ServiceResolver : IServiceResolver
public static void Register<TService>() where TService : IService
ServiceTypes.Add(typeof(TService));
public ServiceResolver(IServiceProvider serviceProvider)
InitializeServices(serviceProvider);
foreach(IService service in Services)
private static void InitializeServices(IServiceProvider serviceProvider)
Services = ServiceTypes.Select(t => ActivatorUtilities.CreateInstance(serviceProvider, t) as IService);
private static List<Type> ServiceTypes = new List<Type>();
private static IEnumerable<IService> Services;
public interface IServiceResolver
public void DoTheThing();
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{}