protected override void ConfigureAutofacServices(ContainerBuilder containerBuilder, IConfigurationRoot configurationRoot) { containerBuilder .Register(c => { var serviceBusConfiguration = c.Resolve <IOptionsSnapshot <ServiceBusConfiguration> >(); var topicClient = new TopicClientWrapper(serviceBusConfiguration.Value.ConnectionString, serviceBusConfiguration.Value.TopicPath); return(topicClient); }) .Keyed <TopicClientWrapper>(PackageVerificationTopicClientBindingKey); containerBuilder .RegisterType <ProcessSignatureEnqueuer>() .WithParameter(new ResolvedParameter( (pi, ctx) => pi.ParameterType == typeof(ITopicClient), (pi, ctx) => ctx.ResolveKeyed <TopicClientWrapper>(PackageVerificationTopicClientBindingKey))) .WithParameter(new ResolvedParameter( (pi, ctx) => pi.ParameterType == typeof(IBrokeredMessageSerializer <SignatureValidationMessage>), (pi, ctx) => ctx.Resolve <SignatureValidationMessageSerializer>())) .As <IProcessSignatureEnqueuer>(); containerBuilder .RegisterType <ScopedMessageHandler <PackageValidationMessageData> >() .Keyed <IMessageHandler <PackageValidationMessageData> >(OrchestratorBindingKey); containerBuilder .RegisterTypeWithKeyedParameter < ISubscriptionProcessor <PackageValidationMessageData>, SubscriptionProcessor <PackageValidationMessageData>, IMessageHandler <PackageValidationMessageData> >( OrchestratorBindingKey); // Configure the email enqueuer. containerBuilder .Register(c => { var configuration = c.Resolve <IOptionsSnapshot <EmailConfiguration> >().Value.ServiceBus; return(new TopicClientWrapper(configuration.ConnectionString, configuration.TopicPath)); }) .Keyed <ITopicClient>(EmailBindingKey); containerBuilder .RegisterTypeWithKeyedParameter < IEmailMessageEnqueuer, EmailMessageEnqueuer, ITopicClient>( EmailBindingKey); // Configure Validators var validatingType = configurationRoot .GetSection(RunnerConfigurationSectionName) .GetValue(nameof(OrchestrationRunnerConfiguration.ValidatingType), ValidatingType.Package); switch (validatingType) { case ValidatingType.Package: ConfigurePackageSigningValidators(containerBuilder); ConfigurePackageCertificatesValidator(containerBuilder); ConfigureScanAndSignProcessor(containerBuilder); ConfigureFlatContainer(containerBuilder); break; case ValidatingType.SymbolPackage: ConfigureSymbolScanValidator(containerBuilder); ConfigureSymbolsValidator(containerBuilder); ConfigureSymbolsIngester(containerBuilder); break; default: throw new NotImplementedException($"Unknown type: {validatingType}"); } ValidationJobBase.ConfigureFeatureFlagAutofacServices(containerBuilder); ConfigureLeaseService(containerBuilder); }
protected override void ConfigureJobServices(IServiceCollection services, IConfigurationRoot configurationRoot) { services.Configure <ValidationConfiguration>(configurationRoot.GetSection(ConfigurationSectionName)); services.Configure <ProcessSignatureConfiguration>(configurationRoot.GetSection(PackageSigningSectionName)); services.Configure <ValidateCertificateConfiguration>(configurationRoot.GetSection(PackageCertificatesSectionName)); services.Configure <OrchestrationRunnerConfiguration>(configurationRoot.GetSection(RunnerConfigurationSectionName)); services.Configure <EmailConfiguration>(configurationRoot.GetSection(EmailConfigurationSectionName)); services.Configure <ScanAndSignConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName)); services.Configure <SymbolScanOnlyConfiguration>(configurationRoot.GetSection(SymbolScanOnlySectionName)); services.Configure <ScanAndSignEnqueuerConfiguration>(configurationRoot.GetSection(ScanAndSignSectionName)); services.Configure <FlatContainerConfiguration>(configurationRoot.GetSection(FlatContainerConfigurationSectionName)); services.Configure <LeaseConfiguration>(configurationRoot.GetSection(LeaseConfigurationSectionName)); services.Configure <SymbolsValidationConfiguration>(configurationRoot.GetSection(SymbolsValidatorSectionName)); services.Configure <SymbolsIngesterConfiguration>(configurationRoot.GetSection(SymbolsIngesterSectionName)); services.AddTransient <ConfigurationValidator>(); services.AddTransient <OrchestrationRunner>(); services.AddScoped <IEntitiesContext>(p => { var connectionFactory = p.GetRequiredService <ISqlConnectionFactory <GalleryDbConfiguration> >(); var connection = connectionFactory.CreateAsync().GetAwaiter().GetResult(); return(new EntitiesContext(connection, readOnly: false)); }); services.AddScoped(p => { var connectionFactory = p.GetRequiredService <ISqlConnectionFactory <ValidationDbConfiguration> >(); var connection = connectionFactory.CreateAsync().GetAwaiter().GetResult(); return(new ValidationEntitiesContext(connection)); }); services.AddScoped <IValidationEntitiesContext>(serviceProvider => serviceProvider.GetRequiredService <ValidationEntitiesContext>()); services.AddScoped <IValidationStorageService, ValidationStorageService>(); services.Add(ServiceDescriptor.Transient(typeof(IEntityRepository <>), typeof(EntityRepository <>))); services.AddTransient <ICorePackageService, CorePackageService>(); services.AddTransient <IEntityService <Package>, PackageEntityService>(); services.AddTransient <ISubscriptionClient>(serviceProvider => { var configuration = serviceProvider.GetRequiredService <IOptionsSnapshot <ServiceBusConfiguration> >().Value; return(new SubscriptionClientWrapper( configuration.ConnectionString, configuration.TopicPath, configuration.SubscriptionName, serviceProvider.GetRequiredService <ILogger <SubscriptionClientWrapper> >())); }); services.AddTransient <ITopicClient>(serviceProvider => { var configuration = serviceProvider.GetRequiredService <IOptionsSnapshot <ServiceBusConfiguration> >().Value; return(new TopicClientWrapper(configuration.ConnectionString, configuration.TopicPath)); }); services.AddTransient <IPackageValidationEnqueuer, PackageValidationEnqueuer>(); services.AddTransient <IValidatorProvider, ValidatorProvider>(); services.AddTransient <IValidationSetProvider <Package>, ValidationSetProvider <Package> >(); // Only one Orchestrator Message Handler will be registered. ConfigureOrchestratorMessageHandler(services, configurationRoot); services.AddTransient <IServiceBusMessageSerializer, ServiceBusMessageSerializer>(); services.AddTransient <IBrokeredMessageSerializer <PackageValidationMessageData>, PackageValidationMessageDataSerializationAdapter>(); services.AddTransient <ICriteriaEvaluator <Package>, PackageCriteriaEvaluator>(); services.AddTransient <IProcessSignatureEnqueuer, ProcessSignatureEnqueuer>(); services.AddTransient <ICloudBlobClient>(c => { var configurationAccessor = c.GetRequiredService <IOptionsSnapshot <ValidationConfiguration> >(); return(new CloudBlobClientWrapper( configurationAccessor.Value.ValidationStorageConnectionString, readAccessGeoRedundant: false)); }); services.AddTransient <ICloudBlobContainerInformationProvider, GalleryCloudBlobContainerInformationProvider>(); services.AddTransient <ICoreFileStorageService, CloudBlobCoreFileStorageService>(); services.AddTransient <IFileDownloader, FileDownloader>(); services.AddTransient <IStatusProcessor <Package>, PackageStatusProcessor>(); services.AddTransient <IValidationSetProvider <Package>, ValidationSetProvider <Package> >(); services.AddTransient <IValidationSetProcessor, ValidationSetProcessor>(); services.AddTransient <IBrokeredMessageSerializer <SignatureValidationMessage>, SignatureValidationMessageSerializer>(); services.AddTransient <IBrokeredMessageSerializer <CertificateValidationMessage>, CertificateValidationMessageSerializer>(); services.AddTransient <IBrokeredMessageSerializer <ScanAndSignMessage>, ScanAndSignMessageSerializer>(); services.AddTransient <IValidatorStateService, ValidatorStateService>(); services.AddTransient <ISimpleCloudBlobProvider, SimpleCloudBlobProvider>(); services.AddTransient <PackageSignatureProcessor>(); services.AddTransient <PackageSignatureValidator>(); services.AddTransient <Messaging.IServiceBusMessageSerializer, Messaging.ServiceBusMessageSerializer>(); services.AddTransient <IMessageServiceConfiguration, CoreMessageServiceConfiguration>(); services.AddTransient <IMessageService, AsynchronousEmailMessageService>(); services.AddTransient <IMessageService <Package>, PackageMessageService>(); services.AddTransient <ICommonTelemetryService, CommonTelemetryService>(); services.AddTransient <ITelemetryService, TelemetryService>(); services.AddTransient <ISubscriptionProcessorTelemetryService, TelemetryService>(); services.AddTransient <ITelemetryClient, TelemetryClientWrapper>(); services.AddTransient <IDiagnosticsService, LoggerDiagnosticsService>(); services.AddSingleton(new TelemetryClient(ApplicationInsightsConfiguration.TelemetryConfiguration)); services.AddTransient <IValidationOutcomeProcessor <Package>, ValidationOutcomeProcessor <Package> >(); services.AddSingleton(p => { var assembly = Assembly.GetEntryAssembly(); var assemblyName = assembly.GetName().Name; var assemblyVersion = assembly.GetCustomAttribute <AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "0.0.0"; var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = (DecompressionMethods.GZip | DecompressionMethods.Deflate), }); client.Timeout = configurationRoot.GetValue <TimeSpan>(PackageDownloadTimeoutName); client.DefaultRequestHeaders.Add("User-Agent", $"{assemblyName}/{assemblyVersion}"); return(client); }); /// See <see cref="SubscriptionProcessorJob{T}.ConfigureDefaultJobServices(IServiceCollection, IConfigurationRoot)"/> /// for reasoning on why this is registered here. services.AddSingleton <IFeatureFlagRefresher, FeatureFlagRefresher>(); ConfigureFileServices(services, configurationRoot); ConfigureOrchestratorSymbolTypes(services); ValidationJobBase.ConfigureFeatureFlagServices(services, configurationRoot); }