diff --git a/EstateReportingAPI.BusinessLogic/QueryTimingInterceptor.cs b/EstateReportingAPI.BusinessLogic/QueryTimingInterceptor.cs index f07b6f5..950e576 100644 --- a/EstateReportingAPI.BusinessLogic/QueryTimingInterceptor.cs +++ b/EstateReportingAPI.BusinessLogic/QueryTimingInterceptor.cs @@ -5,13 +5,14 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Shared.EntityFramework; +using Shared.General; using Shared.Logger; using System; using System.Collections.Generic; using System.Data.Common; using System.Diagnostics; using System.Text; -using Shared.General; +using TransactionProcessor.Database.Contexts; namespace EstateReportingAPI.BusinessLogic; @@ -83,10 +84,37 @@ public ResolvedDbContext Resolve(String connectionStringKey, // Create an isolated service collection and provider ServiceCollection services = new(); - services.AddDbContext(options => { - options.UseSqlServer(connectionString, sqlOptions => sqlOptions.EnableRetryOnFailure()); - options.AddInterceptors(Interceptor); // attach here - }); + + SqlServerRetryOptions retryOptions; + try + { + retryOptions = ConfigurationReader.GetSection("AppSettings:SqlServerRetry"); + } + catch (KeyNotFoundException) + { + retryOptions = null; + } + + if (retryOptions != null) + { + services.AddDbContext(options => { + options.UseSharedSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel"), retry => { + retry.AdditionalTransientErrorNumbers = retryOptions.AdditionalTransientErrorNumbers; + retry.MaxRetryCount = retryOptions.MaxRetryCount; + retry.MaxRetryDelay = retryOptions.MaxRetryDelay; + }); + options.AddInterceptors(Interceptor); + }); + } + else + { + services.AddDbContext(options => { + options.UseSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel"), retry => { retry.EnableRetryOnFailure(); }); + options.AddInterceptors(Interceptor); + }); + + } + ServiceProvider provider = services.BuildServiceProvider(); scope = provider.CreateScope(); diff --git a/EstateReportingAPI/Bootstrapper/RepositoryRegistry.cs b/EstateReportingAPI/Bootstrapper/RepositoryRegistry.cs index ebb3fa3..aaf93cb 100644 --- a/EstateReportingAPI/Bootstrapper/RepositoryRegistry.cs +++ b/EstateReportingAPI/Bootstrapper/RepositoryRegistry.cs @@ -7,31 +7,47 @@ namespace EstateReportingAPI.Bootstrapper; using Lamar; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Internal; +using Microsoft.Extensions.Options; using Shared.EntityFramework; using Shared.General; using System.Diagnostics.CodeAnalysis; [ExcludeFromCodeCoverage] public class RepositoryRegistry : ServiceRegistry{ - public RepositoryRegistry(){ + public RepositoryRegistry() { String? inTestMode = Environment.GetEnvironmentVariable("InTestMode"); - if (String.Compare(inTestMode, Boolean.TrueString, StringComparison.InvariantCultureIgnoreCase) != 0) - { + if (String.Compare(inTestMode, Boolean.TrueString, StringComparison.InvariantCultureIgnoreCase) != 0) { this.AddSingleton(); } + this.AddSingleton(); this.AddSingleton(typeof(IDbContextResolver<>), typeof(DbContextResolverX<>)); - if (Startup.WebHostEnvironment.IsEnvironment("IntegrationTest") || Startup.Configuration.GetValue("ServiceOptions:UseInMemoryDatabase") == true) - { - this.AddDbContext(builder => builder.UseInMemoryDatabase("TransactionProcessorReadModel")); + + if (Startup.WebHostEnvironment.IsEnvironment("IntegrationTest") || Startup.Configuration.GetValue("ServiceOptions:UseInMemoryDatabase") == true) { + this.AddDbContext(builder => { builder.UseInMemoryDatabase("TransactionProcessorReadModel"); }); } else { - this.AddSingleton(); - this.AddDbContext((sp, options) => - { - options.UseSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel")); - options.AddInterceptors(sp.GetRequiredService()); - }); + SqlServerRetryOptions retryOptions; + try { + retryOptions = ConfigurationReader.GetSection("AppSettings:SqlServerRetry"); + } + catch (KeyNotFoundException) { + retryOptions = null; + } + + if (retryOptions != null) { + this.AddDbContext(options => { + options.UseSharedSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel"), retry => { + retry.AdditionalTransientErrorNumbers = retryOptions.AdditionalTransientErrorNumbers; + retry.MaxRetryCount = retryOptions.MaxRetryCount; + retry.MaxRetryDelay = retryOptions.MaxRetryDelay; + }); + }); + } + else { + this.AddDbContext(options => { options.UseSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel"), retry => { retry.EnableRetryOnFailure(); }); }); + + } } } } \ No newline at end of file