Skip to content

Commit ff001bd

Browse files
Merge pull request #45 from TransactionProcessing/task/#39_correlation_id_e2e
Update dependencies and refactor database handling
2 parents c02ec72 + b9668a2 commit ff001bd

5 files changed

Lines changed: 34 additions & 45 deletions

File tree

MobileConfiguration/MobileConfiguration.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
</PackageReference>
1717
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.2" />
1818
<PackageReference Include="NLog.Web.AspNetCore" Version="5.5.0" />
19-
<PackageReference Include="Shared" Version="2025.6.2" />
20-
<PackageReference Include="Shared.Results.Web" Version="2025.6.2" />
19+
<PackageReference Include="Shared" Version="2025.7.2" />
20+
<PackageReference Include="Shared.Results.Web" Version="2025.7.2" />
2121
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.2" />
2222
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" />
2323
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.5">

MobileConfiguration/Program.cs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,15 @@
3737
builder.Services.AddEndpointsApiExplorer();
3838
builder.Services.AddSwaggerGen();
3939
builder.Services.AddSingleton<IConfigurationRepository, ConfigurationRepository>();
40-
builder.Services.AddSingleton<IConnectionStringConfigurationRepository, ConfigurationReaderConnectionStringRepository>();
41-
builder.Services.AddSingleton<Shared.EntityFramework.IDbContextFactory<ConfigurationContext>, DbContextFactory<ConfigurationContext>>();
42-
40+
builder.Services.AddSingleton(typeof(IDbContextResolver<>), typeof(DbContextResolver<>));
4341
Boolean isInMemoryDatabase = Boolean.Parse(ConfigurationReader.GetValue("AppSettings", "InMemoryDatabase"));
4442

4543
if (isInMemoryDatabase) {
4644
builder.Services.AddDbContext<ConfigurationContext>(builder => builder.UseInMemoryDatabase("ConfigurationDatabaseTest"));
47-
DbContextOptionsBuilder<ConfigurationContext> contextBuilder = new DbContextOptionsBuilder<ConfigurationContext>();
48-
contextBuilder = contextBuilder.UseInMemoryDatabase("ConfigurationDatabaseTest");
49-
builder.Services.AddSingleton<Func<String, ConfigurationContext>>(cont => (connectionString) => new ConfigurationContext(contextBuilder.Options));
5045
}
5146
else {
52-
53-
String connectionString = ConfigurationReader.GetConnectionString("ConfigurationDatabase");
54-
builder.Services.AddDbContext<ConfigurationContext>(builder => builder.UseSqlServer(connectionString));
55-
builder.Services.AddSingleton<Func<String, ConfigurationContext>>(cont => (connectionString) => { return new ConfigurationContext(connectionString); });
47+
builder.Services.AddDbContext<ConfigurationContext>(options =>
48+
options.UseSqlServer(configuration.GetConnectionString("ConfigurationDatabase")));
5649
}
5750
bool logRequests = ConfigurationReaderExtensions.GetValueOrDefault<Boolean>("MiddlewareLogging", "LogRequests", true);
5851
bool logResponses = ConfigurationReaderExtensions.GetValueOrDefault<Boolean>("MiddlewareLogging", "LogResponses", true);
@@ -92,11 +85,12 @@
9285

9386
// Configure the HTTP request pipeline.
9487
app.UseAuthorization();
95-
88+
app.UseMiddleware<CorrelationIdMiddleware>();
9689
app.AddRequestLogging();
9790
app.AddResponseLogging();
9891
app.AddExceptionHandler();
9992

93+
10094
app.MapControllers();
10195

10296
InitializeDatabase(app).Wait(CancellationToken.None);
@@ -117,23 +111,20 @@ async Task InitializeDatabase(IApplicationBuilder app)
117111
}
118112
}
119113

120-
public static class ConfigurationReaderExtensions
121-
{
122-
public static T GetValueOrDefault<T>(String sectionName, String keyName, T defaultValue)
123-
{
124-
try
125-
{
114+
public static class ConfigurationReaderExtensions {
115+
public static T GetValueOrDefault<T>(String sectionName,
116+
String keyName,
117+
T defaultValue) {
118+
try {
126119
var value = ConfigurationReader.GetValue(sectionName, keyName);
127120

128-
if (String.IsNullOrEmpty(value))
129-
{
121+
if (String.IsNullOrEmpty(value)) {
130122
return defaultValue;
131123
}
132124

133125
return (T)Convert.ChangeType(value, typeof(T));
134126
}
135-
catch (KeyNotFoundException kex)
136-
{
127+
catch (KeyNotFoundException kex) {
137128
return defaultValue;
138129
}
139130
}

MobileConfiguration/Repository/IConfigurationRepository.cs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ namespace MobileConfiguration.Repository
44
{
55
using Database;
66
using Database.Entities;
7+
using Microsoft.EntityFrameworkCore;
78
using Models;
89
using Newtonsoft.Json;
910
using Shared.EntityFramework;
1011
using Shared.Exceptions;
11-
using Microsoft.EntityFrameworkCore;
12+
using Shared.General;
13+
using Shared.Repositories;
1214
using ApplicationCentreConfiguration = Database.Entities.ApplicationCentreConfiguration;
1315

1416
public interface IConfigurationRepository
@@ -23,24 +25,23 @@ Task UpdateConfiguration(ConfigurationType configurationType,
2325

2426
public class ConfigurationRepository : IConfigurationRepository
2527
{
26-
private readonly Shared.EntityFramework.IDbContextFactory<ConfigurationContext> ContextFactory;
27-
28-
public ConfigurationRepository(Shared.EntityFramework.IDbContextFactory<ConfigurationContext> contextFactory) {
29-
this.ContextFactory = contextFactory;
28+
private readonly IDbContextResolver<ConfigurationContext> Resolver;
29+
private static readonly String ConfigDatabaseName = "ConfigurationDatabase";
30+
public ConfigurationRepository(IDbContextResolver<ConfigurationContext> resolver) {
31+
this.Resolver = resolver;
3032
}
3133
public async Task<MobileConfiguration> GetConfiguration(ConfigurationType configurationType,
3234
String id,
3335
CancellationToken cancellationToken) {
34-
ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase",cancellationToken);
35-
36-
Configuration? configuration = await context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken:cancellationToken);
36+
using ResolvedDbContext<ConfigurationContext>? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName);
37+
Configuration? configuration = await resolvedContext.Context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken:cancellationToken);
3738

3839
if (configuration == null) {
3940
throw new NotFoundException($"No config of type [{configurationType}] found for Id [{id}]");
4041
}
4142

4243
// TODO: create a factory
43-
MobileConfiguration configurationModel = new MobileConfiguration {
44+
MobileConfiguration configurationModel = new() {
4445
ClientId = configuration.ClientId,
4546
ClientSecret = configuration.ClientSecret,
4647
ConfigurationType = (ConfigurationType)configuration.ConfigType,
@@ -67,14 +68,12 @@ public async Task<MobileConfiguration> GetConfiguration(ConfigurationType config
6768

6869
public async Task<Result> CreateConfiguration(MobileConfiguration mobileConfiguration,
6970
CancellationToken cancellationToken) {
70-
ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase", cancellationToken);
71-
7271
Configuration configurationEntity = Factories.Factory.ToEntityConfiguration(mobileConfiguration);
73-
74-
await context.Configurations.AddAsync(configurationEntity,cancellationToken);
72+
using ResolvedDbContext<ConfigurationContext>? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName);
73+
await resolvedContext.Context.Configurations.AddAsync(configurationEntity,cancellationToken);
7574

7675
try {
77-
await context.SaveChangesAsync(cancellationToken);
76+
await resolvedContext.Context.SaveChangesAsync(cancellationToken);
7877
return Result.Success("Configuration created successfully.");
7978
}
8079
catch (Exception ex) {
@@ -86,9 +85,8 @@ public async Task UpdateConfiguration(ConfigurationType configurationType,
8685
String id,
8786
MobileConfiguration mobileConfiguration,
8887
CancellationToken cancellationToken) {
89-
ConfigurationContext context = await this.ContextFactory.GetContext(Guid.NewGuid(), "ConfigurationDatabase", cancellationToken);
90-
91-
Configuration? configuration = await context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken: cancellationToken);
88+
using ResolvedDbContext<ConfigurationContext>? resolvedContext = this.Resolver.Resolve(ConfigDatabaseName);
89+
Configuration? configuration = await resolvedContext.Context.Configurations.SingleOrDefaultAsync(c => c.Id == id && c.ConfigType == (Int32)configurationType, cancellationToken: cancellationToken);
9290

9391
if (configuration == null)
9492
{
@@ -103,7 +101,7 @@ public async Task UpdateConfiguration(ConfigurationType configurationType,
103101
ConfigType = (Int32)mobileConfiguration.ConfigurationType,
104102
Id = mobileConfiguration.Id,
105103
};
106-
await context.Configurations.AddAsync(configuration, cancellationToken);
104+
await resolvedContext.Context.Configurations.AddAsync(configuration, cancellationToken);
107105
}
108106
else {
109107
configuration.ClientSecret = mobileConfiguration.ClientSecret;
@@ -114,7 +112,7 @@ public async Task UpdateConfiguration(ConfigurationType configurationType,
114112
configuration.HostAddresses = JsonConvert.SerializeObject(mobileConfiguration.HostAddresses);
115113
}
116114

117-
await context.SaveChangesAsync(cancellationToken);
115+
await resolvedContext.Context.SaveChangesAsync(cancellationToken);
118116
}
119117
}
120118
}

MobileConfiguration/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
"InMemoryDatabase": false
55
},
66
"ConnectionStrings": {
7-
"ConfigurationDatabase": "server=127.0.0.1;user id=sa;password=sp1ttal;database=ConfigurationHost;Encrypt=false"
7+
"ConfigurationDatabase": "server=127.0.0.1;user id=sa;password=sp1ttal;database=ConfigurationHost-00000000-0000-0000-0000-000000000001;Encrypt=false"
88
}
99
}

MobileConfiguration/nlog.config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
<target name="asyncFile" xsi:type="AsyncWrapper">
66
<target name="logfile" xsi:type="File"
77
fileName="/home/txnproc/trace/mobileconfiguration.log"
8-
layout="${date:format=dd/MM/yyyy HH\:mm\:ss.ffff} | ${level} | ${callsite:className=true} | ${message} | ${exception:format=type,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method:InnerExceptionSeparator= | }"
8+
layout="${date:format=dd/MM/yyyy HH\:mm\:ss.ffff} | ${level} |${mdlc:CorrelationId:fallback=NO-ID}| ${callsite:className=true} | ${message} | ${exception:format=type,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method:InnerExceptionSeparator= | }"
99
archiveFileName="/home/txnproc/trace/mobileconfiguration.{#####}.log"
1010
archiveAboveSize="104857600"
1111
archiveNumbering="Sequence"
1212
concurrentWrites="true"
1313
maxArchiveFiles="2"/>
1414
<target name="healthlogfile" xsi:type="File"
1515
fileName="/home/txnproc/trace/mobileconfiguration_health.log"
16-
layout="${date:format=dd/MM/yyyy HH\:mm\:ss.ffff} | ${level} | ${callsite:className=true} | ${message} | ${exception:format=type,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method:InnerExceptionSeparator= | }"
16+
layout="${date:format=dd/MM/yyyy HH\:mm\:ss.ffff} | ${level} |${mdlc:CorrelationId:fallback=NO-ID}| ${callsite:className=true} | ${message} | ${exception:format=type,method:maxInnerExceptionLevel=5:innerFormat=shortType,message,method:InnerExceptionSeparator= | }"
1717
archiveFileName="/home/txnproc/trace/mobileconfiguration_health.{#####}.log"
1818
archiveAboveSize="104857600"
1919
archiveNumbering="Sequence"

0 commit comments

Comments
 (0)