< Summary

Information
Class: NexusLabs.Needlr.Injection.SourceGen.GeneratedServiceProviderBuilder
Assembly: NexusLabs.Needlr.Injection.SourceGen
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Injection.SourceGen/GeneratedServiceProviderBuilder.cs
Line coverage
80%
Covered lines: 38
Uncovered lines: 9
Coverable lines: 47
Total lines: 119
Line coverage: 80.8%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetCandidateAssemblies()100%11100%
Build(...)100%210%
Build(...)100%210%
Build(...)100%210%
Build(...)100%44100%
ConfigurePostBuildServiceCollectionPlugins(...)50%2290.9%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Injection.SourceGen/GeneratedServiceProviderBuilder.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.DependencyInjection;
 3
 4using NexusLabs.Needlr.Generators;
 5using NexusLabs.Needlr.Injection.SourceGen.PluginFactories;
 6
 7using System.Reflection;
 8
 9namespace NexusLabs.Needlr.Injection.SourceGen;
 10
 11/// <summary>
 12/// Builds and configures an <see cref="IServiceCollection"/> using source-generated plugin discovery.
 13/// </summary>
 14/// <remarks>
 15/// This builder uses <see cref="GeneratedPluginFactory"/> for plugin discovery and is AOT compatible.
 16/// </remarks>
 17[DoNotAutoRegister]
 18public sealed class GeneratedServiceProviderBuilder : IServiceProviderBuilder
 19{
 20    private readonly IServiceCollectionPopulator _serviceCollectionPopulator;
 21    private readonly IAssemblyProvider _assemblyProvider;
 22    private readonly GeneratedPluginFactory _pluginFactory;
 23
 24524    public GeneratedServiceProviderBuilder(
 24525        IServiceCollectionPopulator serviceCollectionPopulator,
 24526        IAssemblyProvider assemblyProvider,
 24527        Func<IReadOnlyList<PluginTypeInfo>> pluginTypeProvider)
 28    {
 24529        ArgumentNullException.ThrowIfNull(serviceCollectionPopulator);
 24530        ArgumentNullException.ThrowIfNull(assemblyProvider);
 24531        ArgumentNullException.ThrowIfNull(pluginTypeProvider);
 32
 24533        _serviceCollectionPopulator = serviceCollectionPopulator;
 24534        _assemblyProvider = assemblyProvider;
 24535        _pluginFactory = new GeneratedPluginFactory(pluginTypeProvider, allowAllWhenAssembliesEmpty: true);
 24536    }
 37
 38    /// <inheritdoc />
 39    public IReadOnlyList<Assembly> GetCandidateAssemblies() =>
 49040        _assemblyProvider.GetCandidateAssemblies();
 41
 42    /// <inheritdoc />
 43    public IServiceProvider Build(
 44        IConfiguration config) =>
 045        Build(
 046            services: new ServiceCollection(),
 047            config: config);
 48
 49    /// <inheritdoc />
 50    public IServiceProvider Build(
 51        IServiceCollection services,
 52        IConfiguration config) =>
 053        Build(
 054            services: services,
 055            config: config,
 056            postPluginRegistrationCallbacks: []);
 57
 58    /// <inheritdoc/>
 59    public IServiceProvider Build(
 60        IServiceCollection services,
 61        IConfiguration config,
 62        IReadOnlyList<Action<IServiceCollection>> postPluginRegistrationCallbacks) =>
 063        Build(services, config, [], postPluginRegistrationCallbacks);
 64
 65    /// <inheritdoc/>
 66    public IServiceProvider Build(
 67        IServiceCollection services,
 68        IConfiguration config,
 69        IReadOnlyList<Action<IServiceCollection>> preRegistrationCallbacks,
 70        IReadOnlyList<Action<IServiceCollection>> postPluginRegistrationCallbacks)
 71    {
 24572        ArgumentNullException.ThrowIfNull(services);
 24573        ArgumentNullException.ThrowIfNull(config);
 24574        ArgumentNullException.ThrowIfNull(preRegistrationCallbacks);
 24575        ArgumentNullException.ThrowIfNull(postPluginRegistrationCallbacks);
 76
 24577        services.AddSingleton(config);
 78
 50879        foreach (var callback in preRegistrationCallbacks)
 80        {
 981            callback.Invoke(services);
 82        }
 83
 24584        _serviceCollectionPopulator.RegisterToServiceCollection(
 24585            services,
 24586            config,
 24587            GetCandidateAssemblies());
 88
 152689        foreach (var callback in postPluginRegistrationCallbacks)
 90        {
 51891            callback.Invoke(services);
 92        }
 93
 24594        var provider = services.BuildServiceProvider();
 24595        ConfigurePostBuildServiceCollectionPlugins(provider, config);
 24596        return provider;
 97    }
 98
 99    /// <inheritdoc />
 100    public void ConfigurePostBuildServiceCollectionPlugins(
 101        IServiceProvider provider,
 102        IConfiguration config)
 103    {
 245104        ArgumentNullException.ThrowIfNull(provider);
 245105        ArgumentNullException.ThrowIfNull(config);
 106
 245107        var candidateAssemblies = GetCandidateAssemblies();
 245108        PostBuildServiceCollectionPluginOptions options = new(
 245109            provider,
 245110            config,
 245111            candidateAssemblies,
 245112            _pluginFactory);
 113
 490114        foreach (var plugin in _pluginFactory.CreatePlugins<IPostBuildServiceCollectionPlugin>())
 115        {
 0116            plugin.Configure(options);
 117        }
 245118    }
 119}