public static IContainer BuildContainer()

in src/endpointmanager/AppContainerConfig.cs [33:131]


        public static IContainer BuildContainer(string[] commandLineArgs)
        {
            var builder = new ContainerBuilder();

            // -------- Single Instance -------

            // The app
            builder.RegisterType<EndpointManager>()
                .AsSelf()
                .SingleInstance();

            // Configuration
            builder.Register(c =>
                {
                    var configBuilder = new ConfigurationBuilder()
                        .AddEnvironmentVariables();

                    return configBuilder.Build();
                })
                .As<IConfigurationRoot>()
                .SingleInstance();

            builder.RegisterType<CommandLineArgumentsManager>()
                .AsSelf()
                .OnActivating(e => e.Instance.ParseGlobalArgs(commandLineArgs))
                .SingleInstance();

            builder.RegisterType<ConsoleOutput>()
                .As<IConsoleOutput>()
                .SingleInstance();

            builder.RegisterType<Common.IO.Output.Console>()
                .As<IConsole>()
                .SingleInstance();

            // Settings
            builder.RegisterType<ApplicationInsightsLoggerConfig>() // By default, this type gets registered to send AI telemetry which can be disabled via an env variable
                .As<IApplicationInsightsLoggerConfig>()
                .SingleInstance();

            builder.RegisterType<WindowsSystemCheckService>()
                .As<IWindowsSystemCheckService>()
                .SingleInstance();

            // Versioning
            builder.RegisterType<AssemblyMetadataProvider>()
                .As<IAssemblyMetadataProvider>()
                .SingleInstance();

            builder.RegisterType<IPManager>()
                .As<IIPManager>()
                .SingleInstance();

            // -------- Instance Per Dependency -------
            builder.RegisterType<WebHostBuilder>()
                .As<IWebHostBuilder>()
                .InstancePerDependency();

            builder.RegisterType<HostsFileManager>()
                .As<IHostsFileManager>()
                .InstancePerDependency();

            builder.RegisterType<Socket>()
                .As<ISocket>()
                .InstancePerDependency();

            builder.RegisterType<ServiceController>()
                .As<IServiceController>()
                .InstancePerDependency();

            // -------- Modules -------

            // MacAddressHash
            builder.RegisterModule(new MacAddressHashModule());

            // Logging Module
            // Note: need to validate commandLineArgs before registering file logger
            if (commandLineArgs.Length != 4)
            {
                throw new ArgumentException($"Received {commandLineArgs.Length} args. Expected 4 args: username, socketFilePath, logFileDirectory and correlationId.");
            }
            builder.RegisterModule(new LoggingModule(ClientNames.EndpointManager)
            {
                EnableDefaultLogFile = true,
                LogFileDirectory = commandLineArgs[2], // We expect the user's logFileDirectory to get passed in on startup (admin temp path is resolved by default)
                ConsoleLoggingEnabled = true, // Users won't see the console for the EndpointManager during its execution
                ApplicationInsightsInstrumentationKey = (c) => ClientConstants.ApplicationInsights.InstrumentationKey,
                MacAddressHash = (c) => c.Resolve<MacInformationProvider>().MacAddressHash,
                OperationContextInitializer = (c, context) =>
                {
                    context.CorrelationId = commandLineArgs[3];
                }
            });

            // Common Module
            builder.RegisterModule<CommonModule>();

            return builder.Build();
        }