Exemplo n.º 1
0
        public FunctionSettings(ExecutionContextOptions context)
        {
            var config = new ConfigurationBuilder()
                         .SetBasePath(context.AppDirectory)
                         .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) // <- Your application settings in your local development environment
                         .AddEnvironmentVariables()                                                // <- Gets you the application settings in Azure
                         .Build();

            CosmosDBEndpoint  = config["COSMOSDB_ENDPOINT"];
            CosmosDBMasterKey = config["COSMOSDB_MASTER_KEY"];
            CosmosDBName      = config["COSMOSDB_NAME"];
            int cacheInMinutes;

            if (int.TryParse(config["CacheInMinutes"], out cacheInMinutes))
            {
                CacheInMinutes = cacheInMinutes;
            }
            else
            {
                CacheInMinutes = 10;
            }
        }
Exemplo n.º 2
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            ExecutionContextOptions executioncontextoptions = builder.Services.BuildServiceProvider()
                                                              .GetService <IOptions <ExecutionContextOptions> >().Value;
            string currentDirectory = executioncontextoptions.AppDirectory;

            IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                                                  .SetBasePath(currentDirectory)
                                                  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                                  .AddEnvironmentVariables();

            IConfigurationRoot config = configBuilder.Build();

            Dictionary <HttpClientConfigName, ApiConfig> httpClientConfigs = config.GetSection("Apis").Get <Dictionary <HttpClientConfigName, ApiConfig> >();

            foreach (KeyValuePair <HttpClientConfigName, ApiConfig> httpClientConfig in httpClientConfigs)
            {
                builder.Services.AddHttpClient(httpClientConfig.Key.ToString(), c =>
                {
                    c.BaseAddress = new Uri(httpClientConfig.Value.BaseAddress);

                    c.Timeout = httpClientConfig.Value.Timeout ?? new TimeSpan(0, 0, 0, 15);

                    foreach (KeyValuePair <string, string> header in httpClientConfig.Value.Headers)
                    {
                        c.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
                }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
                {
                    MaxConnectionsPerServer = httpClientConfig.Value.MaxConnectionsPerServer ?? 15,
                    AutomaticDecompression  = DecompressionMethods.GZip | DecompressionMethods.Deflate
                });
            }

            IConfigurationSection applicationConfigSettings = config.GetSection("ApplicationConfig");

            builder.Services.Configure <ApplicationConfig>(applicationConfigSettings);

            IConfigurationSection connectionStringSettings = config.GetSection("ConnectionStrings");

            builder.Services.Configure <ConnectionStrings>(connectionStringSettings);

            ConnectionStrings connectionStrings = new ConnectionStrings();

            connectionStringSettings.Bind(connectionStrings);


            builder.Services.AddMediatR(typeof(PostNewRequestForHelpHandler).Assembly);
            builder.Services.AddAutoMapper(typeof(AddressDetailsProfile).Assembly);
            builder.Services.AddTransient <IHttpClientWrapper, HttpClientWrapper>();
            builder.Services.AddTransient <IUserService, Core.Services.UserService>();
            builder.Services.AddTransient <IAddressService, AddressService>();
            builder.Services.AddTransient <ICommunicationService, CommunicationService>();
            builder.Services.AddTransient <IGroupService, GroupService>();

            builder.Services.AddTransient <IRepository, Repository>();
            builder.Services.AddTransient <IDistanceCalculator, DistanceCalculator>();
            builder.Services.AddTransient <IJobService, JobService>();
            builder.Services.AddTransient <IJobFilteringService, JobFilteringService>();
            builder.Services.AddTransient <IArchiveService, ArchiveService>();
            builder.Services.AddTransient <IManageRequestsService, ManageRequestsService>();

            builder.Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger <>), typeof(Logger <>)));
            builder.Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILoggerWrapper <>), typeof(LoggerWrapper <>)));

            builder.Services.AddMemCache();
            builder.Services.AddSingleton(x => x.GetService <IMemDistCacheFactory <double?> >().GetCache(new TimeSpan(30, 0, 0, 0), ResetTimeFactory.OnMidday));

            builder.Services.AddDbContext <ApplicationDbContext>(options =>
                                                                 ConfigureDbContextOptionsBuilder(options, connectionStrings.RequestService),
                                                                 ServiceLifetime.Transient
                                                                 );

            // automatically apply EF migrations
            // DbContext is being created manually instead of through DI as it throws an exception and I've not managed to find a way to solve it yet:
            // 'Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IFileLoggingStatusManager' while attempting to activate 'Microsoft.Azure.WebJobs.Script.Diagnostics.HostFileLoggerProvider'.'
            DbContextOptionsBuilder <ApplicationDbContext> dbContextOptionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>();

            ConfigureDbContextOptionsBuilder(dbContextOptionsBuilder, connectionStrings.RequestService);
            ApplicationDbContext dbContext = new ApplicationDbContext(dbContextOptionsBuilder.Options);

            dbContext.Database.Migrate();
        }
Exemplo n.º 3
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // We need to get the app directory this way.  Using Environment.CurrentDirectory doesn't work in Azure.
            ExecutionContextOptions executioncontextoptions = builder.Services.BuildServiceProvider()
                                                              .GetService <IOptions <ExecutionContextOptions> >().Value;
            string currentDirectory = executioncontextoptions.AppDirectory;

            var config = new ConfigurationBuilder()
                         .SetBasePath(currentDirectory)
                         .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                         .AddJsonFile("local.settings.json", true)
                         .AddEnvironmentVariables().Build();

            // DI doesn't work in startup
            PollyHttpPolicies pollyHttpPolicies = new PollyHttpPolicies(new PollyHttpPoliciesConfig());

            Dictionary <HttpClientConfigName, ApiConfig> httpClientConfigs = config.GetSection("Apis").Get <Dictionary <HttpClientConfigName, ApiConfig> >();

            foreach (KeyValuePair <HttpClientConfigName, ApiConfig> httpClientConfig in httpClientConfigs)
            {
                IAsyncPolicy <HttpResponseMessage> retryPolicy = httpClientConfig.Value.IsExternal ? pollyHttpPolicies.ExternalHttpRetryPolicy : pollyHttpPolicies.InternalHttpRetryPolicy;

                builder.Services.AddHttpClient(httpClientConfig.Key.ToString(), c =>
                {
                    c.BaseAddress = new Uri(httpClientConfig.Value.BaseAddress);

                    c.Timeout = httpClientConfig.Value.Timeout ?? new TimeSpan(0, 0, 0, 15);

                    foreach (KeyValuePair <string, string> header in httpClientConfig.Value.Headers)
                    {
                        c.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
                }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
                {
                    MaxConnectionsPerServer = httpClientConfig.Value.MaxConnectionsPerServer ?? int.MaxValue,
                    AutomaticDecompression  = DecompressionMethods.GZip | DecompressionMethods.Deflate
                }).AddPolicyHandler(retryPolicy);
            }

            builder.Services.AddMediatR(typeof(GetUserByIDHandler).Assembly);

            IConfigurationSection connectionStringSettings = config.GetSection("ConnectionStrings");

            builder.Services.Configure <ConnectionStrings>(connectionStringSettings);

            IConfigurationSection applicationConfigSettings = config.GetSection("ApplicationConfig");

            builder.Services.Configure <ApplicationConfig>(applicationConfigSettings);

            var sqlConnectionString = config.GetConnectionString("SqlConnectionString");

            builder.Services.AddDbContext <ApplicationDbContext>(options =>
                                                                 options.UseSqlServer(sqlConnectionString));

            builder.Services.AddTransient <IRepository, Repository>();
            builder.Services.AddTransient <IAddressService, AddressService>();
            builder.Services.AddTransient <ICommunicationService, CommunicationService>();
            builder.Services.AddTransient <IGroupService, GroupService>();
            builder.Services.AddTransient <IHelperService, HelperService>();
            builder.Services.AddTransient <IHttpClientWrapper, HttpClientWrapper>();
            builder.Services.AddTransient <IDistanceCalculator, DistanceCalculator>();
            builder.Services.AddTransient <IVolunteerCache, VolunteerCache>();
            builder.Services.AddTransient <IVolunteersForCacheGetter, VolunteersForCacheGetter>();
            builder.Services.AddSingleton <IPollyMemoryCacheProvider, PollyMemoryCacheProvider>();
            builder.Services.AddTransient <ISystemClock, MockableDateTime>();
            builder.Services.AddTransient <ICoordinatedResetCache, CoordinatedResetCache>();
            builder.Services.AddTransient <IVolunteersFilteredByMinDistanceGetter, VolunteersFilteredByMinDistanceGetter>();
            builder.Services.AddTransient <IMinDistanceFilter, MinDistanceFilter>();

            // add cache
            RedisConfig redisConfig = new RedisConfig();

            config.GetSection("RedisConfig").Bind(redisConfig);
            builder.Services.AddMemDistCache(redisConfig.AppName, redisConfig.ConnectionString);

            builder.Services.AddSingleton <IMemDistCache <IEnumerable <CachedVolunteerDto> > >(x => x.GetService <IMemDistCacheFactory <IEnumerable <CachedVolunteerDto> > >().GetCache(new TimeSpan(7, 0, 0, 0), ResetTimeFactory.OnHour));

            IConfigurationSection firebaseConfigSettings = config.GetSection("FirebaseConfig");

            builder.Services.Configure <FirebaseConfig>(firebaseConfigSettings);
            builder.Services.AddSingleton <IAuthService, AuthService>();

            // automatically apply EF migrations
            DbContextOptionsBuilder <ApplicationDbContext> dbContextOptionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>();

            dbContextOptionsBuilder.UseSqlServer(sqlConnectionString);
            ApplicationDbContext dbContext = new ApplicationDbContext(dbContextOptionsBuilder.Options);

            dbContext.Database.Migrate();
        }
Exemplo n.º 4
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // We need to get the app directory this way.  Using Environment.CurrentDirectory doesn't work in Azure
            ExecutionContextOptions executioncontextoptions = builder.Services.BuildServiceProvider()
                                                              .GetService <IOptions <ExecutionContextOptions> >().Value;
            string currentDirectory = executioncontextoptions.AppDirectory;

            IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                                                  .SetBasePath(currentDirectory)
                                                  .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                                                  .AddEnvironmentVariables();

            IConfigurationRoot config = configBuilder.Build();

            // DI doesn't work in startup
            PollyHttpPolicies pollyHttpPolicies = new PollyHttpPolicies(new PollyHttpPoliciesConfig());

            Dictionary <HttpClientConfigName, ApiConfig> httpClientConfigs = config.GetSection("Apis").Get <Dictionary <HttpClientConfigName, ApiConfig> >();

            foreach (KeyValuePair <HttpClientConfigName, ApiConfig> httpClientConfig in httpClientConfigs)
            {
                IAsyncPolicy <HttpResponseMessage> retryPolicy = httpClientConfig.Value.IsExternal ? pollyHttpPolicies.ExternalHttpRetryPolicy : pollyHttpPolicies.InternalHttpRetryPolicy;

                builder.Services.AddHttpClient(httpClientConfig.Key.ToString(), c =>
                {
                    c.BaseAddress = new Uri(httpClientConfig.Value.BaseAddress);

                    c.Timeout = httpClientConfig.Value.Timeout ?? new TimeSpan(0, 0, 0, 15);

                    foreach (KeyValuePair <string, string> header in httpClientConfig.Value.Headers)
                    {
                        c.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
                }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
                {
                    MaxConnectionsPerServer = httpClientConfig.Value.MaxConnectionsPerServer ?? 15,
                    AutomaticDecompression  = DecompressionMethods.GZip | DecompressionMethods.Deflate
                }).AddPolicyHandler(retryPolicy);
            }

            IConfigurationSection emailConfigSettings = config.GetSection("EmailConfig");

            builder.Services.Configure <EmailConfig>(emailConfigSettings);

            IConfigurationSection serviceBusConfigSettings = config.GetSection("ServiceBusConfig");

            builder.Services.Configure <ServiceBusConfig>(serviceBusConfigSettings);
            ServiceBusConfig serviceBusConfig = serviceBusConfigSettings.Get <ServiceBusConfig>();

            IConfigurationSection sendGridConfigSettings = config.GetSection("SendGridConfig");

            builder.Services.Configure <SendGridConfig>(sendGridConfigSettings);
            var sendGridConfig = config.GetSection("SendGridConfig").Get <SendGridConfig>();

            builder.Services.AddSingleton <ISendGridClient>(new SendGridClient(sendGridConfig.ApiKey));

            builder.Services.AddTransient <IHttpClientWrapper, HttpClientWrapper>();
            builder.Services.AddMediatR(typeof(SendEmailHandler).Assembly);
            builder.Services.AddAutoMapper(typeof(AddressDetailsProfile).Assembly);
            builder.Services.AddSingleton <IQueueClient>(new QueueClient(serviceBusConfig.ConnectionString, serviceBusConfig.MessageQueueName));

            builder.Services.AddSingleton <IMessageFactory, MessageFactory>();
            //builder.Services.AddSingleton<IConnectSendGridService, SendGridService>();
            builder.Services.AddSingleton <ISendEmailService, SendEmailService>();
            builder.Services.AddSingleton <IConnectUserService, ConnectUserService>();
            builder.Services.AddSingleton <IConnectRequestService, ConnectRequestService>();
            builder.Services.AddSingleton <IConnectGroupService, ConnectGroupService>();
            builder.Services.AddTransient <IJobFilteringService, JobFilteringService>();
            builder.Services.AddSingleton <IConnectAddressService, ConnectAddressService>();
            builder.Services.AddSingleton <IConnectSendGridService, ConnectSendGridService>();
            builder.Services.AddSingleton <IDistanceCalculator, DistanceCalculator>();
            builder.Services.AddSingleton <IPurgeService, PurgeService>();

            builder.Services.AddDbContext <ApplicationDbContext>(options =>
                                                                 options.UseInMemoryDatabase(databaseName: "CommunicationService.AzureFunction"));
            builder.Services.AddTransient <IRepository, Repository>();

            CosmosConfig cosmosConfig = config.GetSection("CosmosConfig").Get <CosmosConfig>();

            builder.Services.AddSingleton <ICosmosDbService>(InitializeCosmosClientInstance(cosmosConfig));

            InterUserMessageConfig interUserMessageConfig = config.GetSection("InterUserMessageConfig").Get <InterUserMessageConfig>();

            builder.Services.AddSingleton <IInterUserMessageRepository>(InitializeCosmosClientInstance(interUserMessageConfig));

            IConfigurationSection linkConfigSettings = config.GetSection("LinkConfig");

            builder.Services.Configure <LinkConfig>(linkConfigSettings);

            LinkConfig linkConfig = config.GetSection("LinkConfig").Get <LinkConfig>();

            builder.Services.AddSingleton <ILinkRepository>(InitializeCosmosClientInstance(linkConfig));

            SendGridManagement.EmailTemplateUploader emailTemplateUploader =
                new SendGridManagement.EmailTemplateUploader(new SendGridClient(sendGridConfig.ApiKey), InitializeCosmosClientInstance(cosmosConfig));

            builder.Services.AddSingleton <IPollyMemoryCacheProvider, PollyMemoryCacheProvider>();
            builder.Services.AddMemCache();
            builder.Services.AddSingleton(x => x.GetService <IMemDistCacheFactory <LocationDetails> >().GetCache(new TimeSpan(30, 0, 0, 0), ResetTimeFactory.OnMidday));
            builder.Services.AddSingleton(x => x.GetService <IMemDistCacheFactory <Template> >().GetCache(new TimeSpan(30, 0, 0, 0), ResetTimeFactory.OnMidday));
            builder.Services.AddSingleton(x => x.GetService <IMemDistCacheFactory <UnsubscribeGroup> >().GetCache(new TimeSpan(30, 0, 0, 0), ResetTimeFactory.OnMidday));


            emailTemplateUploader.Migrate().ConfigureAwait(false);
        }
Exemplo n.º 5
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // We need to get the app directory this way.  Using Environment.CurrentDirectory doesn't work in Azure
            ExecutionContextOptions executioncontextoptions = builder.Services.BuildServiceProvider()
                                                              .GetService <IOptions <ExecutionContextOptions> >().Value;
            string currentDirectory = executioncontextoptions.AppDirectory;

            IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                                                  .SetBasePath(currentDirectory)
                                                  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                                  .AddUserSecrets(Assembly.GetExecutingAssembly(), true)
                                                  .AddEnvironmentVariables();

            IConfigurationRoot config = configBuilder.Build();

            // DI doesn't work in startup
            PollyHttpPolicies pollyHttpPolicies = new PollyHttpPolicies(new PollyHttpPoliciesConfig());

            Dictionary <HttpClientConfigName, ApiConfig> httpClientConfigs = config.GetSection("Apis").Get <Dictionary <HttpClientConfigName, ApiConfig> >();

            foreach (KeyValuePair <HttpClientConfigName, ApiConfig> httpClientConfig in httpClientConfigs)
            {
                if (httpClientConfig.Key == HttpClientConfigName.Qas && !httpClientConfig.Value.Headers.ContainsKey("auth-token"))
                {
                    throw new Exception("Qas requires auth-token header");
                }

                IAsyncPolicy <HttpResponseMessage> retryPolicy = httpClientConfig.Value.IsExternal ? pollyHttpPolicies.ExternalHttpRetryPolicy : pollyHttpPolicies.InternalHttpRetryPolicy;

                builder.Services.AddHttpClient(httpClientConfig.Key.ToString(), c =>
                {
                    c.BaseAddress = new Uri(httpClientConfig.Value.BaseAddress);

                    c.Timeout = httpClientConfig.Value.Timeout ?? new TimeSpan(0, 0, 0, 15);

                    foreach (KeyValuePair <string, string> header in httpClientConfig.Value.Headers)
                    {
                        c.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
                }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
                {
                    MaxConnectionsPerServer = httpClientConfig.Value.MaxConnectionsPerServer ?? 15,
                    AutomaticDecompression  = DecompressionMethods.GZip | DecompressionMethods.Deflate
                }).AddPolicyHandler(retryPolicy);
            }

            builder.Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger <>), typeof(Logger <>)));
            builder.Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILoggerWrapper <>), typeof(LoggerWrapper <>)));

            builder.Services.AddTransient <IHttpClientWrapper, HttpClientWrapper>();

            builder.Services.AddTransient <IQasMapper, QasMapper>();
            builder.Services.AddTransient <IQasService, QasService>();

            builder.Services.AddTransient <IPostcodeIoService, PostcodeIoService>();
            builder.Services.AddTransient <IDistanceCalculator, DistanceCalculator>();
            builder.Services.AddTransient <INearestPostcodeGetter, NearestPostcodeGetter>();
            builder.Services.AddTransient <IQasAddressGetter, QasAddressGetter>();
            builder.Services.AddTransient <IPostcodeAndAddressGetter, PostcodeAndAddressGetter>();

            builder.Services.AddTransient <IPostcodeCoordinatesGetter, PostcodeCoordinatesGetter>();
            builder.Services.AddSingleton <IPostcodesWithoutAddressesCache, PostcodesWithoutAddressesCache>();

            builder.Services.AddTransient <IRegexPostcodeValidator, RegexPostcodeValidator>();
            builder.Services.AddTransient <IPostcodeValidator, PostcodeValidator>();

            builder.Services.AddTransient <IAddressDetailsSorter, AddressDetailsSorter>();

            builder.Services.AddTransient <IFriendlyNameGenerator, FriendlyNameGenerator>();

            builder.Services.AddMediatR(typeof(GetPostcodeHandler).Assembly);

            IEnumerable <Type> autoMapperProfiles = typeof(PostCodeProfile).Assembly.GetTypes().Where(x => typeof(Profile).IsAssignableFrom(x)).ToList();

            foreach (var profile in autoMapperProfiles)
            {
                builder.Services.AddAutoMapper(profile.Assembly);
            }

            builder.Services.AddTransient <IRepository, Repository>();


            IConfigurationSection applicationConfigSettings = config.GetSection("ApplicationConfig");

            builder.Services.Configure <ApplicationConfig>(applicationConfigSettings);

            IConfigurationSection connectionStringSettings = config.GetSection("ConnectionStrings");

            builder.Services.Configure <ConnectionStrings>(connectionStringSettings);

            ConnectionStrings connectionStrings = new ConnectionStrings();

            connectionStringSettings.Bind(connectionStrings);

            builder.Services.AddDbContext <ApplicationDbContext>(options =>
                                                                 ConfigureDbContextOptionsBuilder(options, connectionStrings.AddressService),
                                                                 ServiceLifetime.Transient
                                                                 );

            // automatically apply EF migrations
            // DbContext is being created manually instead of through DI as it throws an exception and I've not managed to find a way to solve it yet:
            // 'Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IFileLoggingStatusManager' while attempting to activate 'Microsoft.Azure.WebJobs.Script.Diagnostics.HostFileLoggerProvider'.'
            DbContextOptionsBuilder <ApplicationDbContext> dbContextOptionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>();

            ConfigureDbContextOptionsBuilder(dbContextOptionsBuilder, connectionStrings.AddressService);
            ApplicationDbContext dbContext = new ApplicationDbContext(dbContextOptionsBuilder.Options);

            dbContext.Database.Migrate();
        }
Exemplo n.º 6
0
        public override void Configure(IFunctionsHostBuilder builder)
        {
            // We need to get the app directory this way.  Using Environment.CurrentDirectory doesn't work in Azure
            ExecutionContextOptions executioncontextoptions = builder.Services.BuildServiceProvider()
                                                              .GetService <IOptions <ExecutionContextOptions> >().Value;
            string currentDirectory = executioncontextoptions.AppDirectory;

            IConfigurationBuilder configBuilder = new ConfigurationBuilder()
                                                  .SetBasePath(currentDirectory)
                                                  .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                                                  .AddEnvironmentVariables();

            IConfigurationRoot config = configBuilder.Build();

            Dictionary <HttpClientConfigName, ApiConfig> httpClientConfigs = config.GetSection("Apis").Get <Dictionary <HttpClientConfigName, ApiConfig> >();

            var retryPolicy = HttpPolicyExtensions
                              .HandleTransientHttpError()
                              .RetryAsync(3);

            IEnumerable <TimeSpan> timeSpans = new[]
            {
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(5),
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(20)
            };

            foreach (KeyValuePair <HttpClientConfigName, ApiConfig> httpClientConfig in httpClientConfigs)
            {
                builder.Services.AddHttpClient(httpClientConfig.Key.ToString(), c =>
                {
                    c.BaseAddress = new Uri(httpClientConfig.Value.BaseAddress);

                    c.Timeout = httpClientConfig.Value.Timeout ?? new TimeSpan(0, 0, 0, 30);

                    foreach (KeyValuePair <string, string> header in httpClientConfig.Value.Headers)
                    {
                        c.DefaultRequestHeaders.Add(header.Key, header.Value);
                    }
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
                    c.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
                }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
                {
                    MaxConnectionsPerServer = httpClientConfig.Value.MaxConnectionsPerServer ?? 15,
                    AutomaticDecompression  = DecompressionMethods.GZip | DecompressionMethods.Deflate
                })
                .AddTransientHttpErrorPolicy(x => x.WaitAndRetryAsync(timeSpans));
            }

            IConfigurationSection applicationConfigSettings = config.GetSection("ApplicationConfig");

            builder.Services.Configure <ApplicationConfig>(applicationConfigSettings);

            builder.Services.AddTransient <IHttpClientWrapper, HttpClientWrapper>();
            builder.Services.AddSingleton <IReportsService, ReportsService>();
            builder.Services.AddSingleton <IConnectCommunicationService, ConnectCommunicationService>();
            builder.Services.AddSingleton <IConnectUserService, ConnectUserService>();
            builder.Services.AddSingleton <IConnectRequestService, ConnectRequestService>();
            builder.Services.AddSingleton <IConnectVerificationService, ConnectVerificationService>();
        }
Exemplo n.º 7
0
 public GitRepository(IOptions <ExecutionContextOptions> executionContextOptions, ILogger <GitRepository> logger)
 {
     _executionContextOptions = executionContextOptions.Value;
     _logger = logger;
 }