< 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
 29024    public GeneratedServiceProviderBuilder(
 29025        IServiceCollectionPopulator serviceCollectionPopulator,
 29026        IAssemblyProvider assemblyProvider,
 29027        Func<IReadOnlyList<PluginTypeInfo>> pluginTypeProvider)
 28    {
 29029        ArgumentNullException.ThrowIfNull(serviceCollectionPopulator);
 29030        ArgumentNullException.ThrowIfNull(assemblyProvider);
 29031        ArgumentNullException.ThrowIfNull(pluginTypeProvider);
 32
 29033        _serviceCollectionPopulator = serviceCollectionPopulator;
 29034        _assemblyProvider = assemblyProvider;
 29035        _pluginFactory = new GeneratedPluginFactory(pluginTypeProvider, allowAllWhenAssembliesEmpty: true);
 29036    }
 37
 38    /// <inheritdoc />
 39    public IReadOnlyList<Assembly> GetCandidateAssemblies() =>
 58040        _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    {
 27572        ArgumentNullException.ThrowIfNull(services);
 27573        ArgumentNullException.ThrowIfNull(config);
 27574        ArgumentNullException.ThrowIfNull(preRegistrationCallbacks);
 27575        ArgumentNullException.ThrowIfNull(postPluginRegistrationCallbacks);
 76
 27577        services.AddSingleton(config);
 78
 56879        foreach (var callback in preRegistrationCallbacks)
 80        {
 981            callback.Invoke(services);
 82        }
 83
 27584        _serviceCollectionPopulator.RegisterToServiceCollection(
 27585            services,
 27586            config,
 27587            GetCandidateAssemblies());
 88
 169289        foreach (var callback in postPluginRegistrationCallbacks)
 90        {
 57191            callback.Invoke(services);
 92        }
 93
 27594        var provider = services.BuildServiceProvider();
 27595        ConfigurePostBuildServiceCollectionPlugins(provider, config);
 27596        return provider;
 97    }
 98
 99    /// <inheritdoc />
 100    public void ConfigurePostBuildServiceCollectionPlugins(
 101        IServiceProvider provider,
 102        IConfiguration config)
 103    {
 290104        ArgumentNullException.ThrowIfNull(provider);
 290105        ArgumentNullException.ThrowIfNull(config);
 106
 290107        var candidateAssemblies = GetCandidateAssemblies();
 290108        PostBuildServiceCollectionPluginOptions options = new(
 290109            provider,
 290110            config,
 290111            candidateAssemblies,
 290112            _pluginFactory);
 113
 580114        foreach (var plugin in _pluginFactory.CreatePlugins<IPostBuildServiceCollectionPlugin>())
 115        {
 0116            plugin.Configure(options);
 117        }
 290118    }
 119}