public void RegisterComponents(IServiceCollection builder) { builder.AddSingleton <IDateTimeProvider, DateTimeProvider>(); builder.AddSingleton <IUserProfileProvider, UserProfileProvider>(); builder .AddSingleton <IHealthChecker, ControllerResolverHealthCheck>(); builder .AddSingleton <IDefinitionsService, DefinitionsService>() .AddSingleton <IHealthChecker, DefinitionsService>(); builder .AddSingleton <IProvidersApiClient, ProvidersApiClient>(); builder.AddSingleton <IProviderSourceDatasetRepository, ProviderSourceDatasetRepository>(ctx => new ProviderSourceDatasetRepository(CreateCosmosDbSettings("providerdatasets"))); builder .AddSingleton <IDatasetService, DatasetService>() .AddSingleton <IHealthChecker, DatasetService>(); builder .AddSingleton <IDatasetDataMergeService, DatasetDataMergeService>(); builder .AddSingleton <IJobManagement, JobManagement>(); builder .AddScoped <IProcessDatasetService, ProcessDatasetService>() .AddScoped <IHealthChecker, ProcessDatasetService>(); builder .AddSingleton <IValidator <CreateNewDatasetModel>, CreateNewDatasetModelValidator>(); builder .AddSingleton <IValidator <DatasetVersionUpdateModel>, DatasetVersionUpdateModelValidator>(); builder .AddSingleton <IValidator <DatasetMetadataModel>, DatasetMetadataModelValidator>(); builder .AddSingleton <IValidator <GetDatasetBlobModel>, GetDatasetBlobModelValidator>(); builder .AddSingleton <IValidator <DatasetDefinition>, DatasetDefinitionValidator>(); builder .AddSingleton <IValidator <CreateDefinitionSpecificationRelationshipModel>, CreateDefinitionSpecificationRelationshipModelValidator>(); builder .AddSingleton <IExcelDatasetWriter, DataDefinitionExcelWriter>(); builder .AddSingleton <IValidator <ExcelPackage>, DatasetWorksheetValidator>(); builder .AddSingleton <IDefinitionChangesDetectionService, DefinitionChangesDetectionService>(); builder .AddSingleton <IDatasetDefinitionNameChangeProcessor, DatasetDefinitionNameChangeProcessor>(); builder .AddSingleton <IValidator <CreateDatasetDefinitionFromTemplateModel>, CreateDatasetDefinitionFromTemplateModelValidator>(); builder .AddSingleton <IPolicyRepository, PolicyRepository>(); builder .AddSingleton <IBlobClient, BlobClient>((ctx) => { BlobStorageOptions storageSettings = new BlobStorageOptions(); Configuration.Bind("AzureStorageSettings", storageSettings); storageSettings.ContainerName = "datasets"; IBlobContainerRepository blobContainerRepository = new BlobContainerRepository(storageSettings); return(new BlobClient(blobContainerRepository)); }); builder .AddSingleton <LocalIBlobClient, LocalBlobClient>((ctx) => { AzureStorageSettings storageSettings = new AzureStorageSettings(); Configuration.Bind("AzureStorageSettings", storageSettings); storageSettings.ContainerName = "datasets"; return(new LocalBlobClient(storageSettings)); }); builder.AddSingleton <IProviderSourceDatasetsRepository, ProviderSourceDatasetsRepository>(ctx => new ProviderSourceDatasetsRepository(CreateCosmosDbSettings("providerdatasets"))); builder.AddSingleton <IDatasetsAggregationsRepository, DatasetsAggregationsRepository>(ctx => new DatasetsAggregationsRepository(CreateCosmosDbSettings("datasetaggregations"))); builder.AddSingleton <IVersionRepository <ProviderSourceDatasetVersion>, VersionRepository <ProviderSourceDatasetVersion> >(ctx => new VersionRepository <ProviderSourceDatasetVersion>(CreateCosmosDbSettings("providerdatasets"), new NewVersionBuilderFactory <ProviderSourceDatasetVersion>())); builder.AddSingleton <IDatasetRepository, DataSetsRepository>(ctx => new DataSetsRepository(CreateCosmosDbSettings("datasets"))); builder .AddSingleton <IDatasetSearchService, DatasetSearchService>() .AddSingleton <IHealthChecker, DatasetSearchService>(); builder.AddSingleton <IDatasetDefinitionSearchService, DatasetDefinitionSearchService>(); builder .AddSingleton <IDefinitionSpecificationRelationshipService, DefinitionSpecificationRelationshipService>() .AddSingleton <IHealthChecker, DefinitionSpecificationRelationshipService>(); builder .AddSingleton <IExcelDatasetReader, ExcelDatasetReader>(); builder .AddSingleton <ICalcsRepository, CalcsRepository>(); builder .AddSingleton <IProviderSourceDatasetVersionKeyProvider, ProviderSourceDatasetVersionKeyProvider>(); builder .AddSingleton <ICancellationTokenProvider, HttpContextCancellationProvider>(); MapperConfiguration dataSetsConfig = new MapperConfiguration(c => { c.AddProfile <DatasetsMappingProfile>(); c.AddProfile <CalculationsMappingProfile>(); c.AddProfile <ProviderMappingProfile>(); }); builder .AddSingleton(dataSetsConfig.CreateMapper()); builder.AddCalculationsInterServiceClient(Configuration); builder.AddJobsInterServiceClient(Configuration); builder.AddProvidersInterServiceClient(Configuration); builder.AddPoliciesInterServiceClient(Configuration); builder.AddSearch(Configuration); builder .AddSingleton <ISearchRepository <DatasetIndex>, SearchRepository <DatasetIndex> >(); builder .AddSingleton <ISearchRepository <DatasetDefinitionIndex>, SearchRepository <DatasetDefinitionIndex> >(); builder .AddSingleton <ISearchRepository <DatasetVersionIndex>, SearchRepository <DatasetVersionIndex> >(); builder.AddServiceBus(Configuration); builder.AddCaching(Configuration); builder.AddFeatureToggling(Configuration); builder.AddApplicationInsightsTelemetry(); builder.AddApplicationInsightsTelemetryClient(Configuration, "CalculateFunding.Api.Datasets"); builder.AddApplicationInsightsServiceName(Configuration, "CalculateFunding.Api.Datasets"); builder.AddLogging("CalculateFunding.Api.Datasets"); builder.AddTelemetry(); builder.AddApiKeyMiddlewareSettings((IConfigurationRoot)Configuration); builder.AddHttpContextAccessor(); PolicySettings policySettings = ServiceCollectionExtensions.GetPolicySettings(Configuration); DatasetsResiliencePolicies resiliencePolicies = CreateResiliencePolicies(policySettings); builder.AddSingleton <IDatasetsResiliencePolicies>(resiliencePolicies); builder.AddSingleton <IJobManagementResiliencePolicies>((ctx) => { AsyncBulkheadPolicy totalNetworkRequestsPolicy = ResiliencePolicyHelpers.GenerateTotalNetworkRequestsPolicy(policySettings); return(new JobManagementResiliencePolicies() { JobsApiClient = ResiliencePolicyHelpers.GenerateRestRepositoryPolicy(totalNetworkRequestsPolicy) }); }); builder.AddTransient <IValidator <DatasetUploadValidationModel>, DatasetUploadValidationModelValidator>(); builder.AddSpecificationsInterServiceClient(Configuration); builder.AddHealthCheckMiddleware(); if (Configuration.IsSwaggerEnabled()) { builder.ConfigureSwaggerServices(title: "Datasets Microservice API"); } builder.AddSingleton <IVersionBulkRepository <ProviderSourceDatasetVersion>, VersionBulkRepository <ProviderSourceDatasetVersion> >((ctx) => { CosmosDbSettings settings = new CosmosDbSettings(); Configuration.Bind("CosmosDbSettings", settings); settings.ContainerName = "providerdatasets"; CosmosRepository cosmos = new CosmosRepository(settings, new CosmosClientOptions { AllowBulkExecution = true }); return(new VersionBulkRepository <ProviderSourceDatasetVersion>(cosmos, new NewVersionBuilderFactory <ProviderSourceDatasetVersion>())); }); builder.AddSingleton <IProviderSourceDatasetBulkRepository, ProviderSourceDatasetBulkRepository>((ctx) => { CosmosDbSettings settings = new CosmosDbSettings(); Configuration.Bind("CosmosDbSettings", settings); settings.ContainerName = "providerdatasets"; CosmosRepository cosmos = new CosmosRepository(settings, new CosmosClientOptions { AllowBulkExecution = true }); return(new ProviderSourceDatasetBulkRepository(cosmos)); }); }
private static IServiceProvider Register(IServiceCollection builder, IConfigurationRoot config) { // These registrations of the functions themselves are just for the DebugQueue. Ideally we don't want these registered in production if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") { builder.AddScoped <OnDataDefinitionChanges>(); builder.AddScoped <OnDatasetEvent>(); builder.AddScoped <OnDatasetValidationEvent>(); builder.AddScoped <OnDatasetEventFailure>(); builder.AddScoped <OnDatasetValidationEventFailure>(); builder.AddScoped <OnMapFdzDatasetsEventFired>(); builder.AddScoped <OnMapFdzDatasetsEventFiredFailure>(); builder.AddScoped <OnDeleteDatasets>(); builder.AddScoped <OnDeleteDatasetsFailure>(); } builder.AddSingleton <IDateTimeProvider, DateTimeProvider>(); builder.AddSingleton <IUserProfileProvider, UserProfileProvider>(); builder .AddSingleton <IDefinitionsService, DefinitionsService>(); builder .AddSingleton <IProvidersApiClient, ProvidersApiClient>(); builder.AddSingleton <IProviderSourceDatasetRepository, ProviderSourceDatasetRepository>(ctx => new ProviderSourceDatasetRepository(CreateCosmosDbSettings(config, "providerdatasets"))); builder .AddSingleton <IDatasetService, DatasetService>(); builder .AddSingleton <IDatasetDataMergeService, DatasetDataMergeService>(); builder .AddSingleton <IJobManagement, JobManagement>(); builder .AddSingleton <IDeadletterService, DeadletterService>(); builder .AddScoped <IProcessDatasetService, ProcessDatasetService>(); builder .AddSingleton <IValidator <CreateNewDatasetModel>, CreateNewDatasetModelValidator>(); builder .AddSingleton <IValidator <DatasetVersionUpdateModel>, DatasetVersionUpdateModelValidator>(); builder .AddSingleton <IValidator <DatasetMetadataModel>, DatasetMetadataModelValidator>(); builder .AddSingleton <IValidator <GetDatasetBlobModel>, GetDatasetBlobModelValidator>(); builder .AddSingleton <IValidator <CreateDefinitionSpecificationRelationshipModel>, CreateDefinitionSpecificationRelationshipModelValidator>(); builder .AddSingleton <IExcelDatasetWriter, DataDefinitionExcelWriter>(); builder .AddSingleton <IValidator <ExcelPackage>, DatasetWorksheetValidator>(); builder .AddSingleton <IValidator <DatasetDefinition>, DatasetDefinitionValidator>(); builder .AddSingleton <IDefinitionChangesDetectionService, DefinitionChangesDetectionService>(); builder .AddScoped <IDatasetDefinitionNameChangeProcessor, DatasetDefinitionNameChangeProcessor>(); builder .AddSingleton <IValidator <CreateDatasetDefinitionFromTemplateModel>, CreateDatasetDefinitionFromTemplateModelValidator>(); builder .AddSingleton <IPolicyRepository, PolicyRepository>(); builder .AddSingleton <IBlobClient, BlobClient>((ctx) => { BlobStorageOptions storageSettings = new BlobStorageOptions(); config.Bind("AzureStorageSettings", storageSettings); storageSettings.ContainerName = "datasets"; IBlobContainerRepository blobContainerRepository = new BlobContainerRepository(storageSettings); return(new BlobClient(blobContainerRepository)); }); builder .AddSingleton <LocalIBlobClient, LocalBlobClient>((ctx) => { AzureStorageSettings storageSettings = new AzureStorageSettings(); config.Bind("AzureStorageSettings", storageSettings); storageSettings.ContainerName = "datasets"; return(new LocalBlobClient(storageSettings)); }); builder.AddSingleton <IProviderSourceDatasetsRepository, ProviderSourceDatasetsRepository>(ctx => new ProviderSourceDatasetsRepository(CreateCosmosDbSettings(config, "providerdatasets"))); builder.AddSingleton <IDatasetRepository, DataSetsRepository>(ctx => { return(new DataSetsRepository(CreateCosmosDbSettings(config, "datasets"))); }); builder.AddSingleton <IDatasetSearchService, DatasetSearchService>(); builder.AddSingleton <IProviderSourceDatasetVersionKeyProvider, ProviderSourceDatasetVersionKeyProvider>(); builder.AddSingleton <IDatasetDefinitionSearchService, DatasetDefinitionSearchService>(); builder .AddSingleton <IDefinitionSpecificationRelationshipService, DefinitionSpecificationRelationshipService>(); builder .AddSingleton <IExcelDatasetReader, ExcelDatasetReader>(); builder .AddSingleton <ICalcsRepository, CalcsRepository>(); builder.AddTransient <IValidator <DatasetUploadValidationModel>, DatasetUploadValidationModelValidator>(); MapperConfiguration dataSetsConfig = new MapperConfiguration(c => { c.AddProfile <DatasetsMappingProfile>(); c.AddProfile <CalculationsMappingProfile>(); c.AddProfile <ProviderMappingProfile>(); }); builder .AddSingleton(dataSetsConfig.CreateMapper()); builder.AddSingleton <IVersionRepository <ProviderSourceDatasetVersion>, VersionRepository <ProviderSourceDatasetVersion> >(ctx => new VersionRepository <ProviderSourceDatasetVersion>(CreateCosmosDbSettings(config, "providerdatasets"), new NewVersionBuilderFactory <ProviderSourceDatasetVersion>())); builder.AddSingleton <IDatasetsAggregationsRepository, DatasetsAggregationsRepository>(ctx => new DatasetsAggregationsRepository(CreateCosmosDbSettings(config, "datasetaggregations"))); builder.AddScoped <IUserProfileProvider, UserProfileProvider>(); builder.AddCalculationsInterServiceClient(config, handlerLifetime: Timeout.InfiniteTimeSpan); builder.AddSpecificationsInterServiceClient(config, handlerLifetime: Timeout.InfiniteTimeSpan); builder.AddJobsInterServiceClient(config, handlerLifetime: Timeout.InfiniteTimeSpan); builder.AddProvidersInterServiceClient(config, handlerLifetime: Timeout.InfiniteTimeSpan); builder.AddPoliciesInterServiceClient(config, handlerLifetime: Timeout.InfiniteTimeSpan); builder.AddSearch(config); builder .AddSingleton <ISearchRepository <DatasetIndex>, SearchRepository <DatasetIndex> >(); builder .AddSingleton <ISearchRepository <DatasetDefinitionIndex>, SearchRepository <DatasetDefinitionIndex> >(); builder .AddSingleton <ISearchRepository <DatasetVersionIndex>, SearchRepository <DatasetVersionIndex> >(); builder.AddServiceBus(config, "datasets"); builder.AddCaching(config); builder.AddApplicationInsightsTelemetryClient(config, "CalculateFunding.Functions.Datasets"); builder.AddApplicationInsightsServiceName(config, "CalculateFunding.Functions.Datasets"); builder.AddLogging("CalculateFunding.Functions.Datasets"); builder.AddTelemetry(); builder.AddFeatureToggling(config); PolicySettings policySettings = ServiceCollectionExtensions.GetPolicySettings(config); DatasetsResiliencePolicies resiliencePolicies = CreateResiliencePolicies(policySettings); builder.AddSingleton <IDatasetsResiliencePolicies>(resiliencePolicies); builder.AddSingleton <IJobManagementResiliencePolicies>((ctx) => { AsyncBulkheadPolicy totalNetworkRequestsPolicy = ResiliencePolicyHelpers.GenerateTotalNetworkRequestsPolicy(policySettings); return(new JobManagementResiliencePolicies() { JobsApiClient = ResiliencePolicyHelpers.GenerateRestRepositoryPolicy(totalNetworkRequestsPolicy) }); }); builder.AddSingleton <IVersionBulkRepository <ProviderSourceDatasetVersion>, VersionBulkRepository <ProviderSourceDatasetVersion> >((ctx) => { CosmosDbSettings settings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", settings); settings.ContainerName = "providerdatasets"; CosmosRepository cosmos = new CosmosRepository(settings, new CosmosClientOptions { AllowBulkExecution = true }); return(new VersionBulkRepository <ProviderSourceDatasetVersion>(cosmos, new NewVersionBuilderFactory <ProviderSourceDatasetVersion>())); }); builder.AddSingleton <IProviderSourceDatasetBulkRepository, ProviderSourceDatasetBulkRepository>((ctx) => { CosmosDbSettings settings = new CosmosDbSettings(); config.Bind("CosmosDbSettings", settings); settings.ContainerName = "providerdatasets"; CosmosRepository cosmos = new CosmosRepository(settings, new CosmosClientOptions { AllowBulkExecution = true }); return(new ProviderSourceDatasetBulkRepository(cosmos)); }); return(builder.BuildServiceProvider()); }