Skip to content

Commit d948b62

Browse files
(#2) Start work on refreshable values
1 parent be37fb2 commit d948b62

9 files changed

+72
-5
lines changed

src/Example/TheHostedService.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,23 @@ public class TheHostedService : IHostedService, IDisposable
1717
{
1818
private readonly ILogger<TheHostedService> _logger;
1919
private readonly IConfigurationRoot _configRoot;
20-
private readonly IOptions<MyFeatureConfiguration> _featureValues;
20+
private readonly IOptionsMonitor<MyFeatureConfiguration> _featureValues;
2121
private readonly Timer _timer;
2222

2323
public TheHostedService(
2424
ILogger<TheHostedService> logger,
2525
IConfigurationRoot configRoot,
26-
IOptions<MyFeatureConfiguration> featureValues)
26+
IOptionsMonitor<MyFeatureConfiguration> featureValues)
2727
{
2828
_logger = logger;
2929
_configRoot = configRoot;
3030
_featureValues = featureValues;
3131
_timer = new Timer(10000);
3232
_timer.Elapsed += TimerOnElapsed;
33+
featureValues.OnChange((v, s) =>
34+
{
35+
Console.WriteLine($"Change detected. {s}");
36+
});
3337
}
3438

3539
private void TimerOnElapsed(object? sender, ElapsedEventArgs e)
@@ -38,7 +42,7 @@ private void TimerOnElapsed(object? sender, ElapsedEventArgs e)
3842
{
3943
WriteIndented = true,
4044
};
41-
string json = JsonSerializer.Serialize(_featureValues.Value, jsonOptions);
45+
string json = JsonSerializer.Serialize(_featureValues.CurrentValue, jsonOptions);
4246
Console.Clear();
4347
_logger.LogInformation(
4448
"At {Time} the object looks like:\n{Json}",

src/Example/appsettings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"AppConfiguration": {
44
"SchemaName": "Stravaig",
55
"TableName": "AppConfiguration",
6+
"RefreshSeconds": 15,
67
"ConnectionString": "*** Found in User Secrets ***"
78
}
89
},
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Stravaig.Configuration.SqlServer;
2+
3+
public interface ISqlServerConfigurationWatcher
4+
{
5+
void EnsureStarted();
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Stravaig.Configuration.SqlServer;
2+
3+
public class NullSqlServerConfigurationWatcher : ISqlServerConfigurationWatcher
4+
{
5+
public void EnsureStarted()
6+
{
7+
}
8+
}

src/Stravaig.Configuration.SqlServer/SqlServerConfigurationBuilderExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public static IConfigurationBuilder AddSqlServer(this IConfigurationBuilder buil
1515

1616
return builder.Add(new SqlServerConfigurationSource(
1717
options.ConnectionString ?? throw new InvalidOperationException("Cannot build a SQL Server Configuration Provider with a null connection string."),
18+
TimeSpan.FromSeconds(options.RefreshSeconds),
1819
options.SchemaName,
1920
options.TableName));
2021
}

src/Stravaig.Configuration.SqlServer/SqlServerConfigurationOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public class SqlServerConfigurationOptions
88
public string? ConfigurationSection { get; set; }
99
public string SchemaName { get; set; } = DefaultValues.SchemaName;
1010
public string TableName { get; set; } = DefaultValues.TableName;
11+
12+
public int RefreshSeconds { get; set; } = 0;
1113

1214
public SqlServerConfigurationOptions FromExistingConfiguration(string configurationSection = DefaultValues.ConfigurationSection)
1315
{

src/Stravaig.Configuration.SqlServer/SqlServerConfigurationProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ namespace Stravaig.Configuration.SqlServer;
77

88
public class SqlServerConfigurationProvider : ConfigurationProvider
99
{
10-
private Lazy<string> _toStringValue;
10+
private readonly Lazy<string> _toStringValue;
1111
private readonly SqlServerConfigurationSource _source;
1212
private readonly IDataLoader _dataLoader;
13+
private readonly ISqlServerConfigurationWatcher _watcher;
1314

1415
public SqlServerConfigurationProvider(SqlServerConfigurationSource source)
1516
: this (source, new DataLoader())
@@ -21,12 +22,16 @@ internal SqlServerConfigurationProvider(SqlServerConfigurationSource source, IDa
2122
_source = source;
2223
_dataLoader = dataLoader;
2324
_toStringValue = new Lazy<string>(BuildToStringValue);
25+
_watcher = source.RefreshInterval == TimeSpan.Zero
26+
? new NullSqlServerConfigurationWatcher()
27+
: new SqlServerConfigurationWatcher(source.RefreshInterval, this);
2428
}
2529

2630
public override void Load()
2731
{
2832
var data = _dataLoader.RetrieveData(_source);
2933
Data = new Dictionary<string, string>(data, StringComparer.OrdinalIgnoreCase);
34+
_watcher.EnsureStarted();
3035
}
3136

3237
public override string ToString()

src/Stravaig.Configuration.SqlServer/SqlServerConfigurationSource.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@ public class SqlServerConfigurationSource : IConfigurationSource
1111
public string ConnectionString { get; private set; }
1212
public string SchemaName { get; private set; }
1313
public string TableName { get; private set; }
14+
public TimeSpan RefreshInterval { get; private set; }
1415

15-
public SqlServerConfigurationSource(string connectionString, string schemaName = "Stravaig", string tableName = "AppConfiguration")
16+
public SqlServerConfigurationSource(string connectionString, TimeSpan? refreshInterval = null, string schemaName = "Stravaig", string tableName = "AppConfiguration")
1617
{
1718
ValidateConnectionString(connectionString);
1819
ValidateSchemaName(schemaName);
1920
ValidateTableName(tableName);
2021
ConnectionString = connectionString;
2122
SchemaName = schemaName;
2223
TableName = tableName;
24+
RefreshInterval = refreshInterval ?? TimeSpan.Zero;
2325
}
2426

2527
private void ValidateTableName(string tableName)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using System.Timers;
3+
4+
namespace Stravaig.Configuration.SqlServer;
5+
6+
public class SqlServerConfigurationWatcher : ISqlServerConfigurationWatcher
7+
{
8+
private readonly SqlServerConfigurationProvider _provider;
9+
private readonly Timer _timer;
10+
11+
public SqlServerConfigurationWatcher(TimeSpan interval, SqlServerConfigurationProvider provider)
12+
{
13+
_provider = provider;
14+
_timer = new Timer(interval.TotalMilliseconds);
15+
_timer.Elapsed += TimerOnElapsed;
16+
}
17+
18+
private void TimerOnElapsed(object? sender, ElapsedEventArgs e)
19+
{
20+
try
21+
{
22+
Console.WriteLine("Timer elapsed");
23+
_provider.Load();
24+
}
25+
catch (Exception ex)
26+
{
27+
Console.WriteLine(ex.ToString());
28+
// How do we log this? How do we get the logger in here?
29+
}
30+
}
31+
32+
public void EnsureStarted()
33+
{
34+
if (!_timer.Enabled)
35+
_timer.Start();
36+
}
37+
38+
}

0 commit comments

Comments
 (0)