Example #1
0
        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));
            });
        }
Example #2
0
        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());
        }