< Summary

Information
Class: SwitchBlade.Services.ServiceConfiguration
Assembly: SwitchBlade
File(s): D:\a\switchblade\switchblade\Services\ServiceConfiguration.cs
Tag: 203_23722840422
Line coverage
100%
Covered lines: 101
Uncovered lines: 0
Coverable lines: 101
Total lines: 151
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ConfigureServices()100%11100%
ConfigureServices(...)100%22100%

File(s)

D:\a\switchblade\switchblade\Services\ServiceConfiguration.cs

#LineLine coverage
 1using System;
 2using Microsoft.Extensions.DependencyInjection;
 3using SwitchBlade.Contracts;
 4using SwitchBlade.Core;
 5using SwitchBlade.ViewModels;
 6
 7namespace SwitchBlade.Services
 8{
 9    /// <summary>
 10    /// Composition root for dependency injection configuration.
 11    /// All services are registered via factories for 100% constructor-driven initialization.
 12    /// </summary>
 13    public static class ServiceConfiguration
 14    {
 15        /// <summary>
 16        /// Configures and returns the service provider with all registered services.
 17        /// </summary>
 18        public static IServiceProvider ConfigureServices()
 119        {
 120            var services = new ServiceCollection();
 121            ConfigureServices(services);
 122            return services.BuildServiceProvider();
 123        }
 24
 25        /// <summary>
 26        /// Configures the service collection with all application services.
 27        /// </summary>
 28        public static void ConfigureServices(IServiceCollection services)
 329        {
 30
 31            // System Abstractions (v1.9.11 coverage improvements)
 332            services.AddSingleton<ISystemProcessProvider, SystemProcessProvider>();
 333            services.AddSingleton<IProcessFactory, ProcessFactory>();
 334            services.AddSingleton<IFileSystem, FileSystemWrapper>();
 335            services.AddSingleton<IRegistryService, RegistryServiceWrapper>();
 336            services.AddSingleton<INativeInteropWrapper, NativeInteropWrapper>();
 337            services.AddSingleton<IWindowInterop, WindowInterop>();
 38
 39            // Core Services
 340            services.AddSingleton<SettingsService>(sp =>
 141            {
 142                var registryService = sp.GetRequiredService<IRegistryService>();
 143                var logger = sp.GetRequiredService<ILogger>();
 144                return new SettingsService(
 145                    new RegistrySettingsStorage(@"Software\SwitchBlade", registryService),
 146                    new WindowsStartupManager(registryService),
 147                    logger);
 448            });
 449            services.AddSingleton<ISettingsService>(sp => sp.GetRequiredService<SettingsService>());
 350            services.AddSingleton<ThemeService>();
 351            services.AddSingleton<IDispatcherService, WpfDispatcherService>();
 452            services.AddSingleton<IIconService>(sp => new IconService(sp.GetRequiredService<ISettingsService>(), sp.GetR
 353            services.AddSingleton<IIconExtractor, IconExtractor>();
 54
 55            // Logger & Plugin Context
 356            services.AddSingleton<ILogger>(Logger.Instance);
 457            services.AddSingleton<IPluginContext>(sp => new PluginContext(
 458                sp.GetRequiredService<ILogger>(),
 459                sp.GetRequiredService<IWindowInterop>(),
 460                sp.GetRequiredService<IRegistryService>()));
 361            services.AddSingleton<IWorkstationService, WorkstationService>();
 62
 63            // New Services (v1.6.4)
 364            services.AddSingleton<IPluginLoader>(sp =>
 465                new PluginLoader(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"), sp.GetRequire
 66
 467            services.AddSingleton<WindowFinder>(sp => new WindowFinder(
 468                sp.GetRequiredService<ISettingsService>(),
 469                sp.GetRequiredService<IWindowInterop>()));
 70
 371            services.AddSingleton<INavigationService, NavigationService>();
 472            services.AddSingleton<IPluginService>(sp => new PluginService(
 473                sp.GetRequiredService<IPluginContext>(),
 474                sp.GetRequiredService<ISettingsService>(),
 475                sp.GetRequiredService<IRegistryService>(),
 476                sp.GetRequiredService<ILogger>(),
 477                sp.GetRequiredService<IPluginLoader>(),
 478                sp.GetRequiredService<WindowFinder>()));
 79
 80            // Matching Algorithm
 381            services.AddSingleton<IMatcher, FuzzyMatcherAdapter>();
 82
 83            // Window Search Service (with LRU cache)
 384            services.AddSingleton<IWindowSearchService>(sp =>
 185            {
 186                var settings = sp.GetRequiredService<ISettingsService>();
 187                int cacheSize = settings.Settings.RegexCacheSize;
 188                var matcher = sp.GetRequiredService<IMatcher>();
 189                return new WindowSearchService(new LruRegexCache(cacheSize), matcher);
 490            });
 91
 392            services.AddSingleton<INumberShortcutService, NumberShortcutService>();
 93
 94            // UIA Worker Client (out-of-process UIA scanning)
 395            services.AddSingleton<IUiaWorkerClient>(sp =>
 396            {
 397                var logger = sp.GetRequiredService<ILogger>();
 398                var settings = sp.GetRequiredService<ISettingsService>();
 399                var processFactory = sp.GetRequiredService<IProcessFactory>();
 3100                var fileSystem = sp.GetRequiredService<IFileSystem>();
 3101                var timeoutSeconds = settings.Settings.UiaWorkerTimeoutSeconds;
 3102                var timeout = TimeSpan.FromSeconds(timeoutSeconds > 0 ? timeoutSeconds : 60);
 3103                return new UiaWorkerClient(logger, timeout, processFactory, fileSystem);
 6104            });
 105
 106            // Window Orchestration Service (replaces manual provider coordination)
 3107            services.AddSingleton<IWindowReconciler>(sp =>
 4108                new WindowReconciler(sp.GetRequiredService<IIconService>(), sp.GetRequiredService<ILogger>()));
 109
 3110            services.AddSingleton<IWindowOrchestrationService>(sp =>
 1111            {
 1112                var pluginService = sp.GetRequiredService<IPluginService>();
 1113                var reconciler = sp.GetRequiredService<IWindowReconciler>();
 1114                var uiaWorkerClient = sp.GetRequiredService<IUiaWorkerClient>();
 1115                var nativeInterop = sp.GetRequiredService<INativeInteropWrapper>();
 1116                var logger = sp.GetRequiredService<ILogger>();
 1117                var settingsService = sp.GetRequiredService<ISettingsService>();
 3118
 1119                return new WindowOrchestrationService(
 1120                    pluginService.Providers,
 1121                    reconciler,
 1122                    uiaWorkerClient,
 1123                    nativeInterop,
 1124                    new InProcessProviderRunner(logger),
 1125                    new UiaProviderRunner(uiaWorkerClient, logger),
 1126                    logger);
 4127            });
 128
 129            // ViewModels
 4130            services.AddTransient<MainViewModel>(sp => new MainViewModel(
 4131                sp.GetRequiredService<IWindowOrchestrationService>(),
 4132                sp.GetRequiredService<IWindowSearchService>(),
 4133                sp.GetRequiredService<INavigationService>(),
 4134                sp.GetRequiredService<ISettingsService>(),
 4135                sp.GetRequiredService<IDispatcherService>()
 4136            ));
 137
 3138            services.AddSingleton<IUIService, WpfUIService>();
 3139            services.AddSingleton<MainWindow>();
 4140            services.AddTransient<SettingsViewModel>(sp => new SettingsViewModel(
 4141                sp.GetRequiredService<ISettingsService>(),
 4142                sp.GetRequiredService<ThemeService>(),
 4143                sp.GetRequiredService<IPluginService>(),
 4144                sp.GetRequiredService<IUIService>()
 4145            ));
 146
 147            // Diagnostics (Investigation)
 3148            services.AddSingleton<MemoryDiagnosticsService>();
 3149        }
 150    }
 151}