diff --git a/MobileConfiguration/MobileConfiguration.csproj b/MobileConfiguration/MobileConfiguration.csproj index 530917f..70f7542 100644 --- a/MobileConfiguration/MobileConfiguration.csproj +++ b/MobileConfiguration/MobileConfiguration.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/MobileConfiguration/Program.cs b/MobileConfiguration/Program.cs index d3c76d8..ddf207b 100644 --- a/MobileConfiguration/Program.cs +++ b/MobileConfiguration/Program.cs @@ -37,22 +37,15 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton, DbContextFactory>(); - +builder.Services.AddSingleton(typeof(IDbContextResolver<>), typeof(DbContextResolver<>)); Boolean isInMemoryDatabase = Boolean.Parse(ConfigurationReader.GetValue("AppSettings", "InMemoryDatabase")); if (isInMemoryDatabase) { builder.Services.AddDbContext(builder => builder.UseInMemoryDatabase("ConfigurationDatabaseTest")); - DbContextOptionsBuilder contextBuilder = new DbContextOptionsBuilder(); - contextBuilder = contextBuilder.UseInMemoryDatabase("ConfigurationDatabaseTest"); - builder.Services.AddSingleton>(cont => (connectionString) => new ConfigurationContext(contextBuilder.Options)); } else { - - String connectionString = ConfigurationReader.GetConnectionString("ConfigurationDatabase"); - builder.Services.AddDbContext(builder => builder.UseSqlServer(connectionString)); - builder.Services.AddSingleton>(cont => (connectionString) => { return new ConfigurationContext(connectionString); }); + builder.Services.AddDbContext(options => + options.UseSqlServer(configuration.GetConnectionString("ConfigurationDatabase"))); } bool logRequests = ConfigurationReaderExtensions.GetValueOrDefault("MiddlewareLogging", "LogRequests", true); bool logResponses = ConfigurationReaderExtensions.GetValueOrDefault("MiddlewareLogging", "LogResponses", true); @@ -92,11 +85,12 @@ // Configure the HTTP request pipeline. app.UseAuthorization(); - +app.UseMiddleware(); app.AddRequestLogging(); app.AddResponseLogging(); app.AddExceptionHandler(); + app.MapControllers(); InitializeDatabase(app).Wait(CancellationToken.None); @@ -117,23 +111,20 @@ async Task InitializeDatabase(IApplicationBuilder app) } } -public static class ConfigurationReaderExtensions -{ - public static T GetValueOrDefault(String sectionName, String keyName, T defaultValue) - { - try - { +public static class ConfigurationReaderExtensions { + public static T GetValueOrDefault(String sectionName, + String keyName, + T defaultValue) { + try { var value = ConfigurationReader.GetValue(sectionName, keyName); - if (String.IsNullOrEmpty(value)) - { + if (String.IsNullOrEmpty(value)) { return defaultValue; } return (T)Convert.ChangeType(value, typeof(T)); } - catch (KeyNotFoundException kex) - { + catch (KeyNotFoundException kex) { return defaultValue; } } diff --git a/MobileConfiguration/Repository/IConfigurationRepository.cs b/MobileConfiguration/Repository/IConfigurationRepository.cs index af281a2..8c1741a 100644 --- a/MobileConfiguration/Repository/IConfigurationRepository.cs +++ b/MobileConfiguration/Repository/IConfigurationRepository.cs @@ -4,11 +4,13 @@ namespace MobileConfiguration.Repository { using Database; using Database.Entities; + using Microsoft.EntityFrameworkCore; using Models; using Newtonsoft.Json; using Shared.EntityFramework; using Shared.Exceptions; - using Microsoft.EntityFrameworkCore; + using Shared.General; + using Shared.Repositories; using ApplicationCentreConfiguration = Database.Entities.ApplicationCentreConfiguration; public interface IConfigurationRepository @@ -23,24 +25,23 @@ Task UpdateConfiguration(ConfigurationType configurationType, public class ConfigurationRepository : IConfigurationRepository { - private readonly Shared.EntityFramework.IDbContextFactory ContextFactory; - - public ConfigurationRepository(Shared.EntityFramework.IDbContextFactory contextFactory) { - this.ContextFactory = contextFactory; + private readonly IDbContextResolver Resolver; + private static readonly String ConfigDatabaseName = "ConfigurationDatabase"; + public ConfigurationRepository(IDbContextResolver resolver) { + this.Resolver = resolver; } public async Task GetConfiguration(ConfigurationType configurationType, String id, CancellationToken cancellationToken) { - ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase",cancellationToken); - - Configuration? configuration = await context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken:cancellationToken); + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName); + Configuration? configuration = await resolvedContext.Context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken:cancellationToken); if (configuration == null) { throw new NotFoundException($"No config of type [{configurationType}] found for Id [{id}]"); } // TODO: create a factory - MobileConfiguration configurationModel = new MobileConfiguration { + MobileConfiguration configurationModel = new() { ClientId = configuration.ClientId, ClientSecret = configuration.ClientSecret, ConfigurationType = (ConfigurationType)configuration.ConfigType, @@ -67,14 +68,12 @@ public async Task GetConfiguration(ConfigurationType config public async Task CreateConfiguration(MobileConfiguration mobileConfiguration, CancellationToken cancellationToken) { - ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase", cancellationToken); - Configuration configurationEntity = Factories.Factory.ToEntityConfiguration(mobileConfiguration); - - await context.Configurations.AddAsync(configurationEntity,cancellationToken); + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName); + await resolvedContext.Context.Configurations.AddAsync(configurationEntity,cancellationToken); try { - await context.SaveChangesAsync(cancellationToken); + await resolvedContext.Context.SaveChangesAsync(cancellationToken); return Result.Success("Configuration created successfully."); } catch (Exception ex) { @@ -86,9 +85,8 @@ public async Task UpdateConfiguration(ConfigurationType configurationType, String id, MobileConfiguration mobileConfiguration, CancellationToken cancellationToken) { - ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase", cancellationToken); - - Configuration? configuration = await context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken: cancellationToken); + using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName); + Configuration? configuration = await resolvedContext.Context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken: cancellationToken); if (configuration == null) { @@ -103,7 +101,7 @@ public async Task UpdateConfiguration(ConfigurationType configurationType, ConfigType = (Int32)mobileConfiguration.ConfigurationType, Id = mobileConfiguration.Id, }; - await context.Configurations.AddAsync(configuration, cancellationToken); + await resolvedContext.Context.Configurations.AddAsync(configuration, cancellationToken); } else { configuration.ClientSecret = mobileConfiguration.ClientSecret; @@ -114,7 +112,7 @@ public async Task UpdateConfiguration(ConfigurationType configurationType, configuration.HostAddresses = JsonConvert.SerializeObject(mobileConfiguration.HostAddresses); } - await context.SaveChangesAsync(cancellationToken); + await resolvedContext.Context.SaveChangesAsync(cancellationToken); } } } diff --git a/MobileConfiguration/appsettings.json b/MobileConfiguration/appsettings.json index 76cabe1..6075e36 100644 --- a/MobileConfiguration/appsettings.json +++ b/MobileConfiguration/appsettings.json @@ -4,6 +4,6 @@ "InMemoryDatabase": false }, "ConnectionStrings": { - "ConfigurationDatabase": "server=127.0.0.1;user id=sa;password=sp1ttal;database=ConfigurationHost;Encrypt=false" + "ConfigurationDatabase": "server=127.0.0.1;user id=sa;password=sp1ttal;database=ConfigurationHost-00000000-0000-0000-0000-000000000001;Encrypt=false" } } diff --git a/MobileConfiguration/nlog.config b/MobileConfiguration/nlog.config index dd2d11d..ec4bc8d 100644 --- a/MobileConfiguration/nlog.config +++ b/MobileConfiguration/nlog.config @@ -5,7 +5,7 @@