protected override void Load()

in edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.Service/modules/TwinConfigSourceModule.cs [63:248]


        protected override void Load(ContainerBuilder builder)
        {
            // ILogsUploader
            builder.Register(c => new AzureBlobRequestsUploader(this.iotHubHostName, this.deviceId))
                .As<IRequestsUploader>()
                .SingleInstance();

            // Task<ILogsProvider>
            builder.Register(
                async c =>
                {
                    var logsProcessor = new LogsProcessor(new LogMessageParser(this.iotHubHostName, this.deviceId));
                    IRuntimeInfoProvider runtimeInfoProvider = await c.Resolve<Task<IRuntimeInfoProvider>>();
                    return new LogsProvider(runtimeInfoProvider, logsProcessor) as ILogsProvider;
                })
                .As<Task<ILogsProvider>>()
                .SingleInstance();

            // IRequestManager
            builder.Register(
                c =>
                {
                    var requestHandlers = new List<IRequestHandler>
                    {
                        new PingRequestHandler(),
                        new TaskStatusRequestHandler()
                    };
                    return new RequestManager(requestHandlers, this.requestTimeout) as IRequestManager;
                })
                .As<IRequestManager>()
                .SingleInstance();

            // Task<IRequestHandler> - LogsUploadRequestHandler
            builder.Register(
                    async c =>
                    {
                        var requestUploader = c.Resolve<IRequestsUploader>();
                        var runtimeInfoProviderTask = c.Resolve<Task<IRuntimeInfoProvider>>();
                        var logsProviderTask = c.Resolve<Task<ILogsProvider>>();
                        IRuntimeInfoProvider runtimeInfoProvider = await runtimeInfoProviderTask;
                        ILogsProvider logsProvider = await logsProviderTask;
                        return new ModuleLogsUploadRequestHandler(requestUploader, logsProvider, runtimeInfoProvider) as IRequestHandler;
                    })
                .As<Task<IRequestHandler>>()
                .SingleInstance();

            // Task<IRequestHandler> - LogsRequestHandler
            builder.Register(
                    async c =>
                    {
                        var runtimeInfoProviderTask = c.Resolve<Task<IRuntimeInfoProvider>>();
                        var logsProviderTask = c.Resolve<Task<ILogsProvider>>();
                        IRuntimeInfoProvider runtimeInfoProvider = await runtimeInfoProviderTask;
                        ILogsProvider logsProvider = await logsProviderTask;
                        return new ModuleLogsRequestHandler(logsProvider, runtimeInfoProvider) as IRequestHandler;
                    })
                .As<Task<IRequestHandler>>()
                .SingleInstance();

            // Task<IRequestHandler> - SupportBundleRequestHandler
            builder.Register(
                    c =>
                    {
                        IRequestHandler handler = new SupportBundleRequestHandler(c.Resolve<IModuleManager>().GetSupportBundle, c.Resolve<IRequestsUploader>(), this.iotHubHostName);
                        return Task.FromResult(handler);
                    })
                .As<Task<IRequestHandler>>()
                .SingleInstance();

            // Task<IRequestHandler> - RestartRequestHandler
            builder.Register(
                    async c =>
                    {
                        var environmentProviderTask = c.Resolve<Task<IEnvironmentProvider>>();
                        var commandFactoryTask = c.Resolve<Task<ICommandFactory>>();
                        var configSourceTask = c.Resolve<Task<IConfigSource>>();
                        IEnvironmentProvider environmentProvider = await environmentProviderTask;
                        ICommandFactory commandFactory = await commandFactoryTask;
                        IConfigSource configSource = await configSourceTask;
                        return new RestartRequestHandler(environmentProvider, configSource, commandFactory) as IRequestHandler;
                    })
                .As<Task<IRequestHandler>>()
                .SingleInstance();

            // ISdkModuleClientProvider
            builder.Register(c => new SdkModuleClientProvider())
                .As<ISdkModuleClientProvider>()
                .SingleInstance();

            // IEdgeAgentConnection
            builder.Register(
                c =>
                {
                    var serde = c.Resolve<ISerde<DeploymentConfig>>();
                    var deviceClientprovider = c.Resolve<IModuleClientProvider>();
                    var requestManager = c.Resolve<IRequestManager>();
                    var deviceManager = c.Resolve<IDeviceManager>();
                    bool enableSubscriptions = !this.experimentalFeatures.DisableCloudSubscriptions;
                    var deploymentMetrics = c.Resolve<IDeploymentMetrics>();
                    IEdgeAgentConnection edgeAgentConnection = new EdgeAgentConnection(deviceClientprovider, serde, requestManager, deviceManager, enableSubscriptions, this.configRefreshFrequency, deploymentMetrics, this.manifestTrustBundle);
                    return edgeAgentConnection;
                })
                .As<IEdgeAgentConnection>()
                .SingleInstance();

            // Task<IStreamRequestListener>
            builder.Register(
                    async c =>
                    {
                        if (this.enableStreams)
                        {
                            var runtimeInfoProviderTask = c.Resolve<Task<IRuntimeInfoProvider>>();
                            var logsProviderTask = c.Resolve<Task<ILogsProvider>>();
                            var edgeAgentConnection = c.Resolve<IEdgeAgentConnection>();
                            IRuntimeInfoProvider runtimeInfoProvider = await runtimeInfoProviderTask;
                            ILogsProvider logsProvider = await logsProviderTask;
                            var streamRequestHandlerProvider = new StreamRequestHandlerProvider(logsProvider, runtimeInfoProvider);
                            return new StreamRequestListener(streamRequestHandlerProvider, edgeAgentConnection) as IStreamRequestListener;
                        }
                        else
                        {
                            return new NullStreamRequestListener() as IStreamRequestListener;
                        }
                    })
                .As<Task<IStreamRequestListener>>()
                .SingleInstance();

            // Task<IConfigSource>
            builder.Register(
                async c =>
                {
                    var edgeAgentConnection = c.Resolve<IEdgeAgentConnection>();
                    var twinConfigSource = new TwinConfigSource(edgeAgentConnection, this.configuration);
                    var backupSourceTask = c.Resolve<Task<IDeploymentBackupSource>>();
                    IConfigSource backupConfigSource = new BackupConfigSource(await backupSourceTask, twinConfigSource);
                    return backupConfigSource;
                })
                .As<Task<IConfigSource>>()
                .SingleInstance();

            // IReporter
            builder.Register(
                c =>
                {
                    var runtimeInfoDeserializerTypes = new Dictionary<string, Type>
                    {
                        [DockerType] = typeof(DockerReportedRuntimeInfo),
                        [Constants.Unknown] = typeof(UnknownRuntimeInfo)
                    };

                    var edgeAgentDeserializerTypes = new Dictionary<string, Type>
                    {
                        [DockerType] = typeof(EdgeAgentDockerRuntimeModule),
                        [Constants.Unknown] = typeof(UnknownEdgeAgentModule)
                    };

                    var edgeHubDeserializerTypes = new Dictionary<string, Type>
                    {
                        [DockerType] = typeof(EdgeHubDockerRuntimeModule),
                        [Constants.Unknown] = typeof(UnknownEdgeHubModule)
                    };

                    var moduleDeserializerTypes = new Dictionary<string, Type>
                    {
                        [DockerType] = typeof(DockerRuntimeModule)
                    };

                    var deserializerTypesMap = new Dictionary<Type, IDictionary<string, Type>>
                    {
                        { typeof(IRuntimeInfo), runtimeInfoDeserializerTypes },
                        { typeof(IEdgeAgentModule), edgeAgentDeserializerTypes },
                        { typeof(IEdgeHubModule), edgeHubDeserializerTypes },
                        { typeof(IModule), moduleDeserializerTypes }
                    };

                    var edgeAgentConnection = c.Resolve<IEdgeAgentConnection>();
                    return new IoTHubReporter(
                        edgeAgentConnection,
                        new TypeSpecificSerDe<AgentState>(deserializerTypesMap),
                        this.versionInfo) as IReporter;
                })
                .As<IReporter>()
                .SingleInstance();

            base.Load(builder);
        }