< Summary

Information
Class: NexusLabs.Needlr.Hosting.HostFactory
Assembly: NexusLabs.Needlr.Hosting
File(s): /home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Hosting/HostFactory.cs
Line coverage
96%
Covered lines: 96
Uncovered lines: 4
Coverable lines: 100
Total lines: 185
Line coverage: 96%
Branch coverage
75%
Covered branches: 6
Total branches: 8
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Create(...)100%11100%
ConfigureHost(...)100%11100%
RegisterHostPlugins(...)50%2286.66%
RegisterHostApplicationBuilderPlugins(...)50%2287.5%
ConfigureServices(...)100%44100%

File(s)

/home/runner/work/needlr/needlr/src/NexusLabs.Needlr.Hosting/HostFactory.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.DependencyInjection;
 3using Microsoft.Extensions.Hosting;
 4using Microsoft.Extensions.Logging;
 5
 6using NexusLabs.Needlr.Injection;
 7
 8using System.Reflection;
 9
 10namespace NexusLabs.Needlr.Hosting;
 11
 12/// <summary>
 13/// Factory for creating <see cref="IHost"/> instances with Needlr configuration.
 14/// </summary>
 15[DoNotAutoRegister]
 1116public sealed class HostFactory(
 1117    IServiceProviderBuilder _serviceProviderBuilder,
 1118    IServiceCollectionPopulator _serviceCollectionPopulator,
 1119    IPluginFactory _pluginFactory) :
 20    IHostFactory
 21{
 22    /// <inheritdoc />
 23    public IHost Create(
 24        CreateHostOptions options,
 25        Func<HostApplicationBuilder> createHostApplicationBuilderCallback)
 26    {
 1127        options.Logger.LogInformation("Creating host application builder...");
 1128        var hostApplicationBuilder = createHostApplicationBuilderCallback.Invoke();
 29
 1130        var candidateAssemblies = _serviceProviderBuilder.GetCandidateAssemblies();
 31
 1132        ConfigureServices(
 1133            _serviceCollectionPopulator,
 1134            hostApplicationBuilder,
 1135            _pluginFactory,
 1136            options.Logger,
 1137            candidateAssemblies,
 1138            options.PrePluginRegistrationCallbacks,
 1139            options.PostPluginRegistrationCallbacks);
 40
 1141        options.Logger.LogInformation("Building host...");
 1142        var host = hostApplicationBuilder.Build();
 43
 1144        ConfigureHost(
 1145            _serviceProviderBuilder,
 1146            _pluginFactory,
 1147            host,
 1148            options.Logger,
 1149            candidateAssemblies);
 50
 1151        options.Logger.LogInformation("Host created successfully.");
 1152        return host;
 53    }
 54
 55    private static void ConfigureHost(
 56        IServiceProviderBuilder serviceProviderBuilder,
 57        IPluginFactory pluginFactory,
 58        IHost host,
 59        ILogger logger,
 60        IReadOnlyList<Assembly> assembliesToLoadFrom)
 61    {
 1162        ArgumentNullException.ThrowIfNull(serviceProviderBuilder);
 1163        ArgumentNullException.ThrowIfNull(pluginFactory);
 1164        ArgumentNullException.ThrowIfNull(host);
 1165        ArgumentNullException.ThrowIfNull(logger);
 1166        ArgumentNullException.ThrowIfNull(assembliesToLoadFrom);
 67
 1168        logger.LogInformation("Configuring host...");
 69
 1170        RegisterHostPlugins(
 1171            host,
 1172            pluginFactory,
 1173            assembliesToLoadFrom,
 1174            logger);
 75
 1176        var configuration = host.Services.GetRequiredService<IConfiguration>();
 1177        serviceProviderBuilder.ConfigurePostBuildServiceCollectionPlugins(
 1178            host.Services,
 1179            configuration);
 80
 1181        logger.LogInformation("Host configured successfully.");
 1182    }
 83
 84    private static void RegisterHostPlugins(
 85        IHost host,
 86        IPluginFactory pluginFactory,
 87        IReadOnlyList<Assembly> assembliesToLoadFrom,
 88        ILogger logger)
 89    {
 1190        ArgumentNullException.ThrowIfNull(host);
 1191        ArgumentNullException.ThrowIfNull(pluginFactory);
 1192        ArgumentNullException.ThrowIfNull(assembliesToLoadFrom);
 1193        ArgumentNullException.ThrowIfNull(logger);
 94
 1195        logger.LogInformation("Configuring plugins for the host...");
 96
 1197        HostPluginOptions options = new(
 1198            host,
 1199            assembliesToLoadFrom,
 11100            pluginFactory);
 22101        foreach (var plugin in pluginFactory.CreatePluginsFromAssemblies<IHostPlugin>(
 11102            assembliesToLoadFrom))
 103        {
 0104            logger.LogInformation("Configuring host plugin '{PluginName}'...", plugin.GetType().Name);
 0105            plugin.Configure(options);
 106        }
 107
 11108        logger.LogInformation("Configured plugins for the host.");
 11109    }
 110
 111    private static void RegisterHostApplicationBuilderPlugins(
 112        HostApplicationBuilder builder,
 113        IPluginFactory pluginFactory,
 114        IReadOnlyList<Assembly> assembliesToLoadFrom,
 115        ILogger logger)
 116    {
 11117        ArgumentNullException.ThrowIfNull(builder);
 11118        ArgumentNullException.ThrowIfNull(pluginFactory);
 11119        ArgumentNullException.ThrowIfNull(assembliesToLoadFrom);
 11120        ArgumentNullException.ThrowIfNull(logger);
 121
 11122        logger.LogInformation("Configuring plugins for the host application builder...");
 123
 11124        HostApplicationBuilderPluginOptions options = new(
 11125            builder,
 11126            assembliesToLoadFrom,
 11127            logger,
 11128            pluginFactory);
 22129        foreach (var plugin in pluginFactory.CreatePluginsFromAssemblies<IHostApplicationBuilderPlugin>(
 11130            assembliesToLoadFrom))
 131        {
 0132            logger.LogInformation("Configuring host application builder plugin '{PluginName}'...", plugin.GetType().Name
 0133            plugin.Configure(options);
 134        }
 135
 11136        logger.LogInformation("Configured plugins for the host application builder.");
 11137    }
 138
 139    private static void ConfigureServices(
 140        IServiceCollectionPopulator serviceCollectionPopulator,
 141        HostApplicationBuilder builder,
 142        IPluginFactory pluginFactory,
 143        ILogger logger,
 144        IReadOnlyList<Assembly> assembliesToLoadFrom,
 145        IReadOnlyList<Action<IServiceCollection>> prePluginRegistrationCallbacks,
 146        IReadOnlyList<Action<IServiceCollection>> postPluginRegistrationCallbacks)
 147    {
 11148        ArgumentNullException.ThrowIfNull(serviceCollectionPopulator);
 11149        ArgumentNullException.ThrowIfNull(builder);
 11150        ArgumentNullException.ThrowIfNull(pluginFactory);
 11151        ArgumentNullException.ThrowIfNull(logger);
 11152        ArgumentNullException.ThrowIfNull(assembliesToLoadFrom);
 11153        ArgumentNullException.ThrowIfNull(prePluginRegistrationCallbacks);
 11154        ArgumentNullException.ThrowIfNull(postPluginRegistrationCallbacks);
 155
 11156        logger.LogInformation("Configuring host services...");
 157
 24158        foreach (var callback in prePluginRegistrationCallbacks)
 159        {
 1160            logger.LogInformation("Executing pre-plugin registration callback...");
 1161            callback.Invoke(builder.Services);
 162        }
 163
 11164        RegisterHostApplicationBuilderPlugins(
 11165            builder,
 11166            pluginFactory,
 11167            assembliesToLoadFrom,
 11168            logger);
 169
 11170        logger.LogInformation("Registering services to service collection...");
 11171        serviceCollectionPopulator.RegisterToServiceCollection(
 11172            builder.Services,
 11173            builder.Configuration,
 11174            assembliesToLoadFrom);
 11175        logger.LogInformation("Registered services to service collection.");
 176
 24177        foreach (var callback in postPluginRegistrationCallbacks)
 178        {
 1179            logger.LogInformation("Executing post-plugin registration callback...");
 1180            callback.Invoke(builder.Services);
 181        }
 182
 11183        logger.LogInformation("Configured host services successfully.");
 11184    }
 185}