public static IContainer BuildContainer()

in src/dsc/AppContainerConfig.cs [35:190]


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

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

            // The CLI app
            builder.RegisterType<CliApp>()
                   .AsSelf()
                   .SingleInstance();
            builder.Register<CommandLineApplication>(c =>
                    {
                        return new CommandLineApplication();
                    })
                   .AsSelf()
                   .SingleInstance();

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

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

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

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

            builder.RegisterType<ConsoleInput>()
                   .As<IConsoleInput>()
                   .SingleInstance();

            builder.RegisterType<ConsoleLauncher>()
                    .As<IConsoleLauncher>()
                    .SingleInstance();

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

            builder.RegisterType<CommandsConfigurator>()
                   .AsSelf()
                   .SingleInstance();

            #region Commands

            builder.RegisterType<RootCommand>()
                   .AsSelf()
                   .SingleInstance();
            builder.RegisterType<ConnectCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<PrepConnectCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<CleanConnectCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<RoutingHeaderCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<RoutingSupportedCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<CheckCredentialsCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<ListIngressCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<ListNamespaceCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<ListServiceCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<ListContextCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();
            builder.RegisterType<RefreshCredentialsCommand>()
                   .As<ITopLevelCommand>()
                   .SingleInstance();

            #endregion Commands

            // Factories
            builder.Register(c =>
                    {
                        ManagementClientFactory.IsTelemetryEnabledCallback = c.Resolve<IApplicationInsightsLoggerConfig>().IsTelemetryEnabledCallback; // Set the IsTelemetryEnabled callback, in order to instantiate the SDK with the same telemetry collection settings as the CLI
                        ManagementClientFactory.IsLogFileEnabled = c.Resolve<IFileLoggerConfig>().LogFileEnabled;
                        return new ManagementClientFactory(c.Resolve<SourceUserAgentProvider>().UserAgent, c.Resolve<IOperationContext>().CorrelationId);
                    })
                   .As<IManagementClientFactory>()
                   .SingleInstance();
            builder.RegisterType<CliCommandOptionFactory>()
                   .As<ICliCommandOptionFactory>()
                   .SingleInstance();

            // Settings
            builder.RegisterType<KubectlImpl>()
                    .As<IKubectlImpl>()
                    .SingleInstance();

            builder.RegisterType<ApplicationInsightsLoggerConfig>() // This logger config will be used by the CLI code outside of the Client objects provided by the ManagementClientFactory
                   .As<IApplicationInsightsLoggerConfig>()          // By default, this type gets registered to send AI telemetry which can be disabled via an env variable or providing an expliciting callback function
                   .SingleInstance();

            // -------- Instance Per Dependency -------
            builder.RegisterType<HttpClient>()
                    .AsSelf()
                    .ExternallyOwned()
                    .InstancePerDependency();

            builder.RegisterType<WebHostBuilder>()
                    .As<IWebHostBuilder>()
                    .InstancePerDependency();

            builder.RegisterType<SdkErrorHandling>()
                   .As<ISdkErrorHandling>()
                   .InstancePerDependency();

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

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

            // Logging Module
            builder.RegisterModule(new LoggingModule(ClientNames.MindaroCli)
            {
                EnableDefaultLogFile = true,
                ApplicationInsightsInstrumentationKey = (c) => ClientConstants.ApplicationInsights.InstrumentationKey,
                MacAddressHash = (c) => c.Resolve<MacInformationProvider>().MacAddressHash,
                OperationContextInitializer = (c, context) =>
                {
                    context.LoggingProperties[Property.CommandId] = LoggingUtils.NewId();
                    context.CorrelationId = c.Resolve<IEnvironmentVariables>().CorrelationId + LoggingConstants.CorrelationIdSeparator + context.LoggingProperties[Property.CommandId];
                }
            });

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

            // Progress Module
            builder.RegisterModule<ProgressModule>();

            return builder.Build();
        }