Skip to content

Commit a28a2a0

Browse files
committed
Allow using existing Redis connection for cache
Add support for using an existing shared Redis connection when registering the resource cache. ResourceCacheExtensions.AddResourceCache now accepts useExistingRedisConnection and uses RegisterOrUseRedisConnection to either validate an existing IRedisDatabase registration or register a new connection. GeneralStartupExtensions passes the flag and conditionally registers Redis. Added unit tests (ResourceCacheExtensionsTests) covering hybrid/redis/abs scenarios and error when existing connection is missing. Removed ResourceCache Redis connection/password from appsettings and docker-compose to avoid duplicate registrations. Updated app-config.yaml and environment config files (app-config.*.json) to clarify Redis usage and narrow some consumer tags.
1 parent b79ba2c commit a28a2a0

11 files changed

Lines changed: 160 additions & 67 deletions

File tree

Config/app-config.dev.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,7 +1584,7 @@
15841584
"label": null,
15851585
"content_type": "",
15861586
"tags": {
1587-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1587+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15881588
}
15891589
},
15901590
{
@@ -1593,7 +1593,7 @@
15931593
"label": null,
15941594
"content_type": "",
15951595
"tags": {
1596-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1596+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15971597
}
15981598
},
15991599
{
@@ -1602,7 +1602,7 @@
16021602
"label": null,
16031603
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16041604
"tags": {
1605-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1605+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16061606
}
16071607
},
16081608
{
@@ -1611,7 +1611,7 @@
16111611
"label": null,
16121612
"content_type": "",
16131613
"tags": {
1614-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1614+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16151615
}
16161616
},
16171617
{
@@ -1620,7 +1620,7 @@
16201620
"label": null,
16211621
"content_type": "",
16221622
"tags": {
1623-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1623+
"link:consumers": "Normalization"
16241624
}
16251625
},
16261626
{
@@ -1629,7 +1629,7 @@
16291629
"label": null,
16301630
"content_type": "",
16311631
"tags": {
1632-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1632+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16331633
}
16341634
},
16351635
{
@@ -1638,7 +1638,7 @@
16381638
"label": null,
16391639
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16401640
"tags": {
1641-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1641+
"link:consumers": "Normalization"
16421642
}
16431643
},
16441644
{

Config/app-config.qa.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@
15671567
"label": null,
15681568
"content_type": "",
15691569
"tags": {
1570-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1570+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15711571
}
15721572
},
15731573
{
@@ -1576,7 +1576,7 @@
15761576
"label": null,
15771577
"content_type": "",
15781578
"tags": {
1579-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1579+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15801580
}
15811581
},
15821582
{
@@ -1585,7 +1585,7 @@
15851585
"label": null,
15861586
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
15871587
"tags": {
1588-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1588+
"link:consumers": "Normalization"
15891589
}
15901590
},
15911591
{
@@ -1594,7 +1594,7 @@
15941594
"label": null,
15951595
"content_type": "",
15961596
"tags": {
1597-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1597+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15981598
}
15991599
},
16001600
{
@@ -1603,7 +1603,7 @@
16031603
"label": null,
16041604
"content_type": "",
16051605
"tags": {
1606-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1606+
"link:consumers": "Normalization"
16071607
}
16081608
},
16091609
{
@@ -1612,7 +1612,7 @@
16121612
"label": null,
16131613
"content_type": "",
16141614
"tags": {
1615-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1615+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16161616
}
16171617
},
16181618
{
@@ -1621,7 +1621,7 @@
16211621
"label": null,
16221622
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16231623
"tags": {
1624-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1624+
"link:consumers": "Normalization"
16251625
}
16261626
},
16271627
{

Config/app-config.qa2.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@
15671567
"label": null,
15681568
"content_type": "",
15691569
"tags": {
1570-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1570+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15711571
}
15721572
},
15731573
{
@@ -1576,7 +1576,7 @@
15761576
"label": null,
15771577
"content_type": "",
15781578
"tags": {
1579-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1579+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15801580
}
15811581
},
15821582
{
@@ -1585,7 +1585,7 @@
15851585
"label": null,
15861586
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
15871587
"tags": {
1588-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1588+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15891589
}
15901590
},
15911591
{
@@ -1594,7 +1594,7 @@
15941594
"label": null,
15951595
"content_type": "",
15961596
"tags": {
1597-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1597+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
15981598
}
15991599
},
16001600
{
@@ -1603,7 +1603,7 @@
16031603
"label": null,
16041604
"content_type": "",
16051605
"tags": {
1606-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1606+
"link:consumers": "Normalization"
16071607
}
16081608
},
16091609
{
@@ -1612,7 +1612,7 @@
16121612
"label": null,
16131613
"content_type": "",
16141614
"tags": {
1615-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1615+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16161616
}
16171617
},
16181618
{
@@ -1621,7 +1621,7 @@
16211621
"label": null,
16221622
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16231623
"tags": {
1624-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1624+
"link:consumers": "Normalization"
16251625
}
16261626
},
16271627
{

Config/app-config.test.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@
16161616
"label": null,
16171617
"content_type": "",
16181618
"tags": {
1619-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1619+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16201620
}
16211621
},
16221622
{
@@ -1625,7 +1625,7 @@
16251625
"label": null,
16261626
"content_type": "",
16271627
"tags": {
1628-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1628+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16291629
}
16301630
},
16311631
{
@@ -1634,7 +1634,7 @@
16341634
"label": null,
16351635
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16361636
"tags": {
1637-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1637+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16381638
}
16391639
},
16401640
{
@@ -1643,7 +1643,7 @@
16431643
"label": null,
16441644
"content_type": "",
16451645
"tags": {
1646-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1646+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16471647
}
16481648
},
16491649
{
@@ -1652,7 +1652,7 @@
16521652
"label": null,
16531653
"content_type": "",
16541654
"tags": {
1655-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1655+
"link:consumers": "Normalization"
16561656
}
16571657
},
16581658
{
@@ -1661,7 +1661,7 @@
16611661
"label": null,
16621662
"content_type": "",
16631663
"tags": {
1664-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1664+
"link:consumers": "DataAcquisition,DataAcquisitionWorker,Normalization"
16651665
}
16661666
},
16671667
{
@@ -1670,7 +1670,7 @@
16701670
"label": null,
16711671
"content_type": "application/vnd.microsoft.appconfig.keyvaultref+json;charset=utf-8",
16721672
"tags": {
1673-
"link:consumers": "Account,AdminBFF,Audit,AutomationUI,Census,DataAcquisition,DataAcquisitionWorker,Normalization,Notification,QueryDispatch,Report,Submission,Tenant,Terminology"
1673+
"link:consumers": "Normalization"
16741674
}
16751675
},
16761676
{

DotNet/DataAcquisition.AcquisitionWorker/appsettings.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
"ResourceCache": {
2525
"CacheImplementation": "Hybrid",
2626
"Redis": {
27-
"ConnectionString": "",
28-
"Password": "",
2927
"MemoryThresholdPercent": 80.0,
3028
"MaxMemoryBytes": 268435456
3129
},

DotNet/DataAcquisition.Domain/Extensions/GeneralStartupExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ public static void RegisterAll(
8585
builder.Services.RegisterConfigs(builder.Configuration);
8686
builder.RegisterEntityFramework();
8787

88-
if (configureRedis.GetValueOrDefault())
88+
var useExistingRedisConnection = configureRedis.GetValueOrDefault();
89+
90+
if (useExistingRedisConnection)
8991
{
9092
builder.RegisterRedis();
9193
}
@@ -99,7 +101,7 @@ public static void RegisterAll(
99101
builder.Services.RegisterRepositories();
100102
builder.Services.RegisterManagers();
101103
builder.Services.RegisterServices();
102-
builder.Services.AddResourceCache(builder.Configuration);
104+
builder.Services.AddResourceCache(builder.Configuration, useExistingRedisConnection);
103105
builder.Services.RegisterFactories(builder.Configuration);
104106
builder.Services.RegisterTelemetry(builder.Configuration, builder.Environment, serviceInformation.ServiceConfigName);
105107
builder.Services.RegisterProblemDetails((IHostingEnvironment)builder.Environment);

DotNet/DataAcquisition/appsettings.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@
3939
"ResourceCache": {
4040
"CacheImplementation": "Hybrid",
4141
"Redis": {
42-
"ConnectionString": "",
43-
"Password": "",
4442
"MemoryThresholdPercent": 80.0,
4543
"MaxMemoryBytes": 268435456
4644
},
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using FluentAssertions;
2+
using LantanaGroup.Link.Shared.Application.Enums;
3+
using LantanaGroup.Link.Shared.Application.Extensions;
4+
using LantanaGroup.Link.Shared.Application.Interfaces;
5+
using LantanaGroup.Link.Shared.Application.Models.Configs;
6+
using Medallion.Threading;
7+
using Microsoft.Extensions.Configuration;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using StackExchange.Redis.Extensions.Core.Abstractions;
10+
11+
namespace UnitTests.Shared.ResourceCache;
12+
13+
[Trait("Category", "UnitTests")]
14+
public class ResourceCacheExtensionsTests
15+
{
16+
[Fact]
17+
public void AddResourceCache_UsesExistingRedisConnection_ForHybridCache()
18+
{
19+
var services = new ServiceCollection();
20+
var configuration = CreateConfiguration(ResourceCacheType.Hybrid, includeResourceCacheRedisSettings: false);
21+
22+
DistributedLockSettingsExtensions.DistributedLockBuildAndAddToDI(services, configuration, "Redis");
23+
services.AddResourceCache(configuration, useExistingRedisConnection: true);
24+
25+
services.Count(descriptor => descriptor.ServiceType == typeof(IRedisDatabase)).Should().Be(1);
26+
services.Should().ContainSingle(descriptor => descriptor.ServiceType == typeof(IDistributedSemaphoreProvider));
27+
services.Should().ContainSingle(descriptor =>
28+
descriptor.ServiceType == typeof(IResourceCache) && descriptor.ServiceKey == null);
29+
services.Should().ContainSingle(descriptor =>
30+
descriptor.ServiceType == typeof(IResourceCache) && Equals(descriptor.ServiceKey, ResourceCacheType.Redis));
31+
services.Should().ContainSingle(descriptor =>
32+
descriptor.ServiceType == typeof(IResourceCache) && Equals(descriptor.ServiceKey, ResourceCacheType.ABS));
33+
}
34+
35+
[Fact]
36+
public void AddResourceCache_RegistersRedisConnection_ForStandaloneCache()
37+
{
38+
var services = new ServiceCollection();
39+
var configuration = CreateConfiguration(ResourceCacheType.Redis);
40+
41+
services.AddResourceCache(configuration);
42+
43+
services.Count(descriptor => descriptor.ServiceType == typeof(IRedisDatabase)).Should().Be(1);
44+
services.Should().ContainSingle(descriptor => descriptor.ServiceType == typeof(IResourceCache));
45+
}
46+
47+
[Fact]
48+
public void AddResourceCache_Throws_WhenExistingRedisConnectionIsMissing()
49+
{
50+
var services = new ServiceCollection();
51+
var configuration = CreateConfiguration(ResourceCacheType.Redis, includeResourceCacheRedisSettings: false);
52+
53+
var action = () => services.AddResourceCache(configuration, useExistingRedisConnection: true);
54+
55+
action.Should().Throw<InvalidOperationException>()
56+
.WithMessage("*IRedisDatabase registration is required*");
57+
}
58+
59+
[Fact]
60+
public void AddResourceCache_DoesNotRegisterAnotherRedisConnection_ForAbsCache()
61+
{
62+
var services = new ServiceCollection();
63+
var configuration = CreateConfiguration(ResourceCacheType.ABS, includeResourceCacheRedisSettings: false);
64+
65+
DistributedLockSettingsExtensions.DistributedLockBuildAndAddToDI(services, configuration, "Redis");
66+
services.AddResourceCache(configuration, useExistingRedisConnection: true);
67+
68+
services.Count(descriptor => descriptor.ServiceType == typeof(IRedisDatabase)).Should().Be(1);
69+
services.Should().ContainSingle(descriptor => descriptor.ServiceType == typeof(IDistributedSemaphoreProvider));
70+
services.Should().ContainSingle(descriptor => descriptor.ServiceType == typeof(IResourceCache));
71+
}
72+
73+
private static IConfiguration CreateConfiguration(
74+
ResourceCacheType cacheImplementation,
75+
bool includeResourceCacheRedisSettings = true)
76+
{
77+
var settings = new Dictionary<string, string?>
78+
{
79+
["ConnectionStrings:Redis"] = "localhost:6379",
80+
["Redis:Password"] = "redis-password",
81+
["DistributedLockSettings:PoolSize"] = "3",
82+
["ResourceCache:CacheImplementation"] = cacheImplementation.ToString(),
83+
["ResourceCache:BlobStorage:ConnectionString"] = "UseDevelopmentStorage=true"
84+
};
85+
86+
if (includeResourceCacheRedisSettings)
87+
{
88+
settings["ResourceCache:Redis:ConnectionString"] = "localhost:6379";
89+
settings["ResourceCache:Redis:Password"] = "redis-password";
90+
}
91+
92+
return new ConfigurationBuilder()
93+
.AddInMemoryCollection(settings)
94+
.Build();
95+
}
96+
}

0 commit comments

Comments
 (0)