Created
December 1, 2020 10:30
-
-
Save mikehadlow/b8641bddbe6028bd76c11cd6a24522a0 to your computer and use it in GitHub Desktop.
Revisions
-
mikehadlow created this gist
Dec 1, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,82 @@ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace MyNamespace { public class ServiceCollectionWriter { public static void WriteObjectGraph<TRoot>(IServiceCollection services, string path) { using var writer = new StreamWriter(File.OpenWrite(path)); WriteObjectGraph<TRoot>(services, writer.WriteLine); } public static void WriteObjectGraph<TRoot>(IServiceCollection services, Action<string> writeLine) { var serviceLookup = new Dictionary<Type, List<ServiceDescriptor>>(); foreach(var descriptor in services) { if(serviceLookup.ContainsKey(descriptor.ServiceType)) { serviceLookup[descriptor.ServiceType].Add(descriptor); } else { serviceLookup.Add(descriptor.ServiceType, new List<ServiceDescriptor> { descriptor }); } } WriteNode(typeof(TRoot), 0); void WriteNode(Type serviceType, int indent) { var tab = new string(' ', indent * 2); if(serviceLookup.ContainsKey(serviceType)) { foreach (var descriptor in serviceLookup[serviceType]) { if (descriptor.ImplementationType != null) { writeLine($"{tab}{descriptor.ServiceType.Name} -> {descriptor.ImplementationType.Name}"); writeLine($"{tab}{{"); var parameters = descriptor.ImplementationType.GetConstructors().First().GetParameters(); foreach (var parameter in parameters) { if(parameter.ParameterType.IsGenericType && parameter.ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { WriteNode( parameter.ParameterType.GetGenericArguments().First(), indent + 1); } else { WriteNode(parameter.ParameterType, indent + 1); } } writeLine($"{tab}}}"); } else if (descriptor.ImplementationFactory != null) { writeLine($"{tab}{serviceType.Name} -> FACTORY"); } else if (descriptor.ImplementationInstance != null) { writeLine($"{tab}{serviceType.Name} -> INSTANCE"); } else { writeLine($"{tab}{serviceType.Name} -> UNKNOWN"); } } } else { writeLine($"{tab}{serviceType.Name} -> NOT RESOLVED"); } } } } }