< 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
 24924    public GeneratedServiceProviderBuilder(
 24925        IServiceCollectionPopulator serviceCollectionPopulator,
 24926        IAssemblyProvider assemblyProvider,
 24927        Func<IReadOnlyList<PluginTypeInfo>> pluginTypeProvider)
 28    {
 24929        ArgumentNullException.ThrowIfNull(serviceCollectionPopulator);
 24930        ArgumentNullException.ThrowIfNull(assemblyProvider);
 24931        ArgumentNullException.ThrowIfNull(pluginTypeProvider);
 32
 24933        _serviceCollectionPopulator = serviceCollectionPopulator;
 24934        _assemblyProvider = assemblyProvider;
 24935        _pluginFactory = new GeneratedPluginFactory(pluginTypeProvider, allowAllWhenAssembliesEmpty: true);
 24936    }
 37
 38    /// <inheritdoc />
 39    public IReadOnlyList<Assembly> GetCandidateAssemblies() =>
 49840        _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    {
 24972        ArgumentNullException.ThrowIfNull(services);
 24973        ArgumentNullException.ThrowIfNull(config);
 24974        ArgumentNullException.ThrowIfNull(preRegistrationCallbacks);
 24975        ArgumentNullException.ThrowIfNull(postPluginRegistrationCallbacks);
 76
 24977        services.AddSingleton(config);
 78
 51679        foreach (var callback in preRegistrationCallbacks)
 80        {
 981            callback.Invoke(services);
 82        }
 83
 24984        _serviceCollectionPopulator.RegisterToServiceCollection(
 24985            services,
 24986            config,
 24987            GetCandidateAssemblies());
 88
 154289        foreach (var callback in postPluginRegistrationCallbacks)
 90        {
 52291            callback.Invoke(services);
 92        }
 93
 24994        var provider = services.BuildServiceProvider();
 24995        ConfigurePostBuildServiceCollectionPlugins(provider, config);
 24996        return provider;
 97    }
 98
 99    /// <inheritdoc />
 100    public void ConfigurePostBuildServiceCollectionPlugins(
 101        IServiceProvider provider,
 102        IConfiguration config)
 103    {
 249104        ArgumentNullException.ThrowIfNull(provider);
 249105        ArgumentNullException.ThrowIfNull(config);
 106
 249107        var candidateAssemblies = GetCandidateAssemblies();
 249108        PostBuildServiceCollectionPluginOptions options = new(
 249109            provider,
 249110            config,
 249111            candidateAssemblies,
 249112            _pluginFactory);
 113
 498114        foreach (var plugin in _pluginFactory.CreatePlugins<IPostBuildServiceCollectionPlugin>())
 115        {
 0116            plugin.Configure(options);
 117        }
 249118    }
 119}