Skip to content

Instantly share code, notes, and snippets.

@mikehadlow
Created December 1, 2020 10:30
Show Gist options
  • Select an option

  • Save mikehadlow/b8641bddbe6028bd76c11cd6a24522a0 to your computer and use it in GitHub Desktop.

Select an option

Save mikehadlow/b8641bddbe6028bd76c11cd6a24522a0 to your computer and use it in GitHub Desktop.

Revisions

  1. mikehadlow created this gist Dec 1, 2020.
    82 changes: 82 additions & 0 deletions ServiceCollectionWriter.cs
    Original 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");
    }
    }
    }
    }
    }