From eefcc7937c1ecf508502a22121c4042876640582 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sat, 17 May 2025 01:33:39 -0400 Subject: [PATCH 01/10] hybrid cache extension structure Signed-off-by: Caleb Lloyd --- NatsDistributedCache.sln | 15 ++ .../NatsDistributedCache.csproj | 2 +- ...s.cs => NatsDistributedCacheExtensions.cs} | 2 +- src/NatsHybridCache/NatsHybridCache.csproj | 42 ++++++ .../NatsHybridCacheExtensions.cs | 34 +++++ .../packages.linux-x64.lock.json | 132 ++++++++++++++++++ .../packages.osx-arm64.lock.json | 132 ++++++++++++++++++ .../packages.win-x64.lock.json | 132 ++++++++++++++++++ 8 files changed, 489 insertions(+), 2 deletions(-) rename src/NatsDistributedCache/{NatsCacheServiceCollectionExtensions.cs => NatsDistributedCacheExtensions.cs} (97%) create mode 100644 src/NatsHybridCache/NatsHybridCache.csproj create mode 100644 src/NatsHybridCache/NatsHybridCacheExtensions.cs create mode 100644 src/NatsHybridCache/packages.linux-x64.lock.json create mode 100644 src/NatsHybridCache/packages.osx-arm64.lock.json create mode 100644 src/NatsHybridCache/packages.win-x64.lock.json diff --git a/NatsDistributedCache.sln b/NatsDistributedCache.sln index 28cf019..2c0469b 100644 --- a/NatsDistributedCache.sln +++ b/NatsDistributedCache.sln @@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PerfTest", "util\PerfTest\P EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadmeExample", "util\ReadmeExample\ReadmeExample.csproj", "{2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NatsHybridCache", "src\NatsHybridCache\NatsHybridCache.csproj", "{F95B33FB-37B3-44F4-9E10-55835A527CA3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -117,6 +119,18 @@ Global {2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6}.Release|x64.Build.0 = Release|Any CPU {2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6}.Release|x86.ActiveCfg = Release|Any CPU {2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6}.Release|x86.Build.0 = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|x64.ActiveCfg = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|x64.Build.0 = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|x86.ActiveCfg = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Debug|x86.Build.0 = Debug|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|Any CPU.Build.0 = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x64.ActiveCfg = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x64.Build.0 = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x86.ActiveCfg = Release|Any CPU + {F95B33FB-37B3-44F4-9E10-55835A527CA3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -129,5 +143,6 @@ Global {E2375A65-5A56-4708-997F-2311D9E23FB6} = {0C88DD14-F956-CE84-757C-A364CCF449FC} {2F8B1224-AAC1-4ABB-BFF6-35AFE1D33E29} = {55AA232E-1A1A-2839-440B-9DCB8E3B1CD6} {2F16AC9F-97A1-4362-84B4-F03C3EBC6CD6} = {55AA232E-1A1A-2839-440B-9DCB8E3B1CD6} + {F95B33FB-37B3-44F4-9E10-55835A527CA3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} EndGlobalSection EndGlobal diff --git a/src/NatsDistributedCache/NatsDistributedCache.csproj b/src/NatsDistributedCache/NatsDistributedCache.csproj index 617e9ab..ba809cd 100644 --- a/src/NatsDistributedCache/NatsDistributedCache.csproj +++ b/src/NatsDistributedCache/NatsDistributedCache.csproj @@ -9,7 +9,7 @@ true $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk - + CodeCargo CodeCargo diff --git a/src/NatsDistributedCache/NatsCacheServiceCollectionExtensions.cs b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs similarity index 97% rename from src/NatsDistributedCache/NatsCacheServiceCollectionExtensions.cs rename to src/NatsDistributedCache/NatsDistributedCacheExtensions.cs index 2cea755..30c4f3c 100644 --- a/src/NatsDistributedCache/NatsCacheServiceCollectionExtensions.cs +++ b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs @@ -10,7 +10,7 @@ namespace CodeCargo.Nats.DistributedCache; /// /// Extension methods for setting up NATS distributed cache related services in an . /// -public static class NatsCacheServiceCollectionExtensions +public static class NatsDistributedCacheExtensions { /// /// Adds NATS distributed caching services to the specified . diff --git a/src/NatsHybridCache/NatsHybridCache.csproj b/src/NatsHybridCache/NatsHybridCache.csproj new file mode 100644 index 0000000..54c2cfe --- /dev/null +++ b/src/NatsHybridCache/NatsHybridCache.csproj @@ -0,0 +1,42 @@ + + + + true + enable + CodeCargo.Nats.HybridCache + NATS implementation of Microsoft.Extensions.Caching.Hybrid.IHybridCache. + + + true + $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk + + + CodeCargo + CodeCargo + Copyright © $([System.DateTime]::Now.Year) CodeCargo + CodeCargo.Nats.HybridCache + distributed cache;hybrid cache;nats + MIT + README.md + https://github.com/code-cargo/NatsDistributedCache + https://github.com/code-cargo/NatsDistributedCache + git + true + true + true + snupkg + + + + + + + + + + + + + + + diff --git a/src/NatsHybridCache/NatsHybridCacheExtensions.cs b/src/NatsHybridCache/NatsHybridCacheExtensions.cs new file mode 100644 index 0000000..9946fa5 --- /dev/null +++ b/src/NatsHybridCache/NatsHybridCacheExtensions.cs @@ -0,0 +1,34 @@ +using CodeCargo.Nats.DistributedCache; +using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Caching.Hybrid; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using NATS.Client.Core; + +namespace CodeCargo.Nats.HybridCache; + +/// +/// Extension methods for setting up NATS hybrid cache related services in an . +/// +public static class NatsHybridCacheExtensions +{ + public static IHybridCacheBuilder AddNatsHybridCache( + this IServiceCollection services, + Action configureOptions, + object? connectionServiceKey = null) + { + services.AddNatsDistributedCache(configureOptions, connectionServiceKey); + // todo: get the INatsConnection out of the service provider, using connectionServiceKey if it is not null + // to get the keyed service + // then add the serializer registry from the connection below + services.AddHybridCache() + .AddNatsHybridCacheSerializerFactory(); + } + + public static IHybridCacheBuilder AddNatsHybridCacheSerializerFactory( + this IHybridCacheBuilder builder, + INatsSerializerRegistry serializerRegistry) => + builder.AddSerializerFactory(serializerRegistry.ToHybridCacheSerializerFactory()); +} diff --git a/src/NatsHybridCache/packages.linux-x64.lock.json b/src/NatsHybridCache/packages.linux-x64.lock.json new file mode 100644 index 0000000..77b497e --- /dev/null +++ b/src/NatsHybridCache/packages.linux-x64.lock.json @@ -0,0 +1,132 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/NatsHybridCache/packages.osx-arm64.lock.json b/src/NatsHybridCache/packages.osx-arm64.lock.json new file mode 100644 index 0000000..77b497e --- /dev/null +++ b/src/NatsHybridCache/packages.osx-arm64.lock.json @@ -0,0 +1,132 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + } + } + } +} \ No newline at end of file diff --git a/src/NatsHybridCache/packages.win-x64.lock.json b/src/NatsHybridCache/packages.win-x64.lock.json new file mode 100644 index 0000000..77b497e --- /dev/null +++ b/src/NatsHybridCache/packages.win-x64.lock.json @@ -0,0 +1,132 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Direct", + "requested": "[9.4.0, )", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "StyleCop.Analyzers": { + "type": "Direct", + "requested": "[1.2.0-beta.556, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "StyleCop.Analyzers.Unstable": "1.2.0.556" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "UI0TQPVkS78bFdjkTodmkH0Fe8lXv9LnhGFKgKrsgUJ5a5FVdFRcgjIkBVLbGgdRhxWirxH/8IXUtEyYJx6GQg==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "0MXlimU4Dud6t+iNi5NEz3dO2w1HXdhoOLaYFuLPCjAsvlPQGwOT6V2KZRMLEhCAm/stSZt1AUv0XmDdkjvtbw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "System.Diagnostics.DiagnosticSource": "9.0.4" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "fiFI2+58kicqVZyt/6obqoFwHiab7LC4FkQ3mmiBJ28Yy4fAvy2+v9MRnSvvlOO8chTOjKsdafFl/K9veCPo5g==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" + }, + "NATS.Client.Core": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "6mh+fSB9Fx6QfbYRjvswbWDgD04ePBYzB2yIY5GqzyUiUboqxpuOUDO2QOTNkwIqi8IpTMKcySAY+V/DvmvtQA==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.IO.Pipelines": "8.0.0", + "System.Text.Json": "8.0.5" + } + }, + "NATS.Client.JetStream": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "3t5UJyN6nnsrDxWBxklNK06rnNL9aEjnzcOHCXRcZpcfFGeWFm4dG5UXtt7WiW69uWY4MHUlOcbuBKh5/rAuSQ==", + "dependencies": { + "NATS.Client.Core": "2.6.0" + } + }, + "NATS.Client.KeyValueStore": { + "type": "Transitive", + "resolved": "2.6.0", + "contentHash": "/us915HAGYdGAdblH2857w3xapZupmU4vNDODMfysgcg/tLineOtQ2+FqcSrmCVJ6mILngeuHGTk5vghunTpog==", + "dependencies": { + "NATS.Client.JetStream": "2.6.0" + } + }, + "StyleCop.Analyzers.Unstable": { + "type": "Transitive", + "resolved": "1.2.0.556", + "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "Be0emq8bRmcK4eeJIFUt9+vYPf7kzuQrFs8Ef1CdGvXpq/uSve22PTSkRF09bF/J7wmYJ2DHf2v7GaT3vMXnwQ==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" + }, + "CodeCargo.Nats.DistributedCache": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Logging.Abstractions": "[9.0.4, )", + "Microsoft.Extensions.Options": "[9.0.4, )", + "NATS.Client.KeyValueStore": "[2.6.0, )" + } + } + } + } +} \ No newline at end of file From cb745765e51ec058c9f9e3a499c460eeb4e1a04a Mon Sep 17 00:00:00 2001 From: Caleb Lloyd <2414837+caleblloyd@users.noreply.github.com> Date: Sat, 17 May 2025 01:41:41 -0400 Subject: [PATCH 02/10] Document NATS hybrid cache extensions (#17) --- .../NatsHybridCacheExtensions.cs | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/NatsHybridCache/NatsHybridCacheExtensions.cs b/src/NatsHybridCache/NatsHybridCacheExtensions.cs index 9946fa5..6d13779 100644 --- a/src/NatsHybridCache/NatsHybridCacheExtensions.cs +++ b/src/NatsHybridCache/NatsHybridCacheExtensions.cs @@ -14,19 +14,43 @@ namespace CodeCargo.Nats.HybridCache; /// public static class NatsHybridCacheExtensions { + /// + /// Adds NATS hybrid caching to the specified . + /// This registers the NATS distributed cache and configures HybridCache to + /// use the serializer registry from the configured . + /// + /// The to add services to. + /// An action to configure . + /// If set, resolves a keyed instance. + /// The configured . public static IHybridCacheBuilder AddNatsHybridCache( this IServiceCollection services, Action configureOptions, object? connectionServiceKey = null) { services.AddNatsDistributedCache(configureOptions, connectionServiceKey); - // todo: get the INatsConnection out of the service provider, using connectionServiceKey if it is not null - // to get the keyed service - // then add the serializer registry from the connection below - services.AddHybridCache() - .AddNatsHybridCacheSerializerFactory(); + + var builder = services.AddHybridCache(); + + builder.AddSerializerFactory(sp => + { + var natsConnection = connectionServiceKey == null + ? sp.GetRequiredService() + : sp.GetRequiredKeyedService(connectionServiceKey); + + return natsConnection.Opts.SerializerRegistry.ToHybridCacheSerializerFactory(); + }); + + return builder; } + /// + /// Registers an created from the + /// provided . + /// + /// The instance. + /// The providing serializers. + /// The for chaining. public static IHybridCacheBuilder AddNatsHybridCacheSerializerFactory( this IHybridCacheBuilder builder, INatsSerializerRegistry serializerRegistry) => From edc3c493558c0caefa4052f072d0227ad072bec8 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sat, 17 May 2025 01:51:07 -0400 Subject: [PATCH 03/10] update Signed-off-by: Caleb Lloyd --- src/NatsHybridCache/NatsHybridCacheExtensions.cs | 8 +------- ...onsTests.cs => NatsDistributedCacheExtensionsTests.cs} | 0 2 files changed, 1 insertion(+), 7 deletions(-) rename test/UnitTests/Extensions/{CacheServiceExtensionsTests.cs => NatsDistributedCacheExtensionsTests.cs} (100%) diff --git a/src/NatsHybridCache/NatsHybridCacheExtensions.cs b/src/NatsHybridCache/NatsHybridCacheExtensions.cs index 6d13779..8c11b7c 100644 --- a/src/NatsHybridCache/NatsHybridCacheExtensions.cs +++ b/src/NatsHybridCache/NatsHybridCacheExtensions.cs @@ -1,10 +1,6 @@ using CodeCargo.Nats.DistributedCache; -using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; using NATS.Client.Core; namespace CodeCargo.Nats.HybridCache; @@ -29,10 +25,8 @@ public static IHybridCacheBuilder AddNatsHybridCache( object? connectionServiceKey = null) { services.AddNatsDistributedCache(configureOptions, connectionServiceKey); - var builder = services.AddHybridCache(); - - builder.AddSerializerFactory(sp => + builder.Services.AddSingleton(sp => { var natsConnection = connectionServiceKey == null ? sp.GetRequiredService() diff --git a/test/UnitTests/Extensions/CacheServiceExtensionsTests.cs b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs similarity index 100% rename from test/UnitTests/Extensions/CacheServiceExtensionsTests.cs rename to test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs From e4f16255234b3c9876bfe89404a94dd28f752f50 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd <2414837+caleblloyd@users.noreply.github.com> Date: Sat, 17 May 2025 21:40:59 -0400 Subject: [PATCH 04/10] Add NatsHybridCache extension tests and update project refs (#18) --- src/NatsHybridCache/NatsHybridCache.csproj | 2 +- test/IntegrationTests/IntegrationTests.csproj | 2 +- test/TestUtils/TestUtils.csproj | 3 +- .../NatsHybridCacheExtensionsTests.cs | 137 ++++++++++++++++++ test/UnitTests/UnitTests.csproj | 2 +- util/NatsAppHost/NatsAppHost.csproj | 2 +- util/ReadmeExample/ReadmeExample.csproj | 3 +- 7 files changed, 143 insertions(+), 8 deletions(-) create mode 100644 test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs diff --git a/src/NatsHybridCache/NatsHybridCache.csproj b/src/NatsHybridCache/NatsHybridCache.csproj index 54c2cfe..ec21c08 100644 --- a/src/NatsHybridCache/NatsHybridCache.csproj +++ b/src/NatsHybridCache/NatsHybridCache.csproj @@ -1,4 +1,4 @@ - + true diff --git a/test/IntegrationTests/IntegrationTests.csproj b/test/IntegrationTests/IntegrationTests.csproj index 0003c5e..4f76501 100644 --- a/test/IntegrationTests/IntegrationTests.csproj +++ b/test/IntegrationTests/IntegrationTests.csproj @@ -20,7 +20,7 @@ - + diff --git a/test/TestUtils/TestUtils.csproj b/test/TestUtils/TestUtils.csproj index 0c13076..f24ebb1 100644 --- a/test/TestUtils/TestUtils.csproj +++ b/test/TestUtils/TestUtils.csproj @@ -5,7 +5,6 @@ - @@ -13,7 +12,7 @@ - + diff --git a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs new file mode 100644 index 0000000..598a365 --- /dev/null +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -0,0 +1,137 @@ +using CodeCargo.Nats.HybridCache; +using Microsoft.Extensions.Caching.Hybrid; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Moq; +using NATS.Client.Core; + +namespace CodeCargo.Nats.DistributedCache.UnitTests.Extensions; + +public class NatsHybridCacheExtensionsTests +{ + private readonly Mock _mockNatsConnection = new(); + + [Fact] + public void AddNatsHybridCache_RegistersSerializerFactoryAsSingleton() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + }); + + var registration = services.FirstOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); + Assert.NotNull(registration); + Assert.Equal(ServiceLifetime.Singleton, registration!.Lifetime); + } + + [Fact] + public void AddNatsHybridCache_ReplacesPreviouslyUserRegisteredServices() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + services.AddSingleton(new FakeHybridCacheSerializerFactory()); + + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + }); + + var provider = services.BuildServiceProvider(); + var factory = provider.GetRequiredService(); + + Assert.NotEqual(typeof(FakeHybridCacheSerializerFactory), factory.GetType()); + Assert.Contains("NatsHybridCacheSerializerFactory", factory.GetType().Name); + } + + [Fact] + public void AddNatsHybridCache_SetsCacheOptions() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + const string expectedNamespace = "TestNamespace"; + + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + options.CacheKeyPrefix = expectedNamespace; + }); + + var provider = services.BuildServiceProvider(); + var options = provider.GetRequiredService>().Value; + + Assert.Equal(expectedNamespace, options.CacheKeyPrefix); + Assert.Equal("cache", options.BucketName); + } + + [Fact] + public void AddNatsHybridCache_UsesCacheOptionsAction() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + var wasInvoked = false; + + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + wasInvoked = true; + }); + + var sp = services.BuildServiceProvider(); + _ = sp.GetRequiredService(); + + Assert.True(wasInvoked); + } + + [Fact] + public void AddNatsHybridCache_AcceptsConnectionServiceKey_Parameter() + { + var services = new ServiceCollection(); + var defaultConnection = new Mock().Object; + var keyedConnection = new Mock().Object; + + services.AddSingleton(defaultConnection); + services.AddKeyedSingleton("my-key", keyedConnection); + + services.AddNatsHybridCache( + options => { options.BucketName = "cache"; }, + connectionServiceKey: "my-key"); + + var cacheReg = services.FirstOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); + Assert.NotNull(cacheReg); + Assert.Equal(ServiceLifetime.Singleton, cacheReg!.Lifetime); + Assert.Null(cacheReg.ImplementationType); + Assert.NotNull(cacheReg.ImplementationFactory); + + var optionsReg = services.FirstOrDefault(d => d.ServiceType == typeof(IConfigureOptions)); + Assert.NotNull(optionsReg); + } + + [Fact] + public void AddNatsHybridCacheSerializerFactory_AddsSerializerFactory() + { + var builderMock = new Mock(); + var registry = NatsOpts.Default.SerializerRegistry; + + builderMock + .Setup(b => b.AddSerializerFactory(It.IsAny())) + .Returns(builderMock.Object) + .Verifiable(); + + var result = builderMock.Object.AddNatsHybridCacheSerializerFactory(registry); + + builderMock.Verify(b => b.AddSerializerFactory(It.IsAny()), Times.Once); + Assert.Equal(builderMock.Object, result); + } + + private class FakeHybridCacheSerializerFactory : IHybridCacheSerializerFactory + { + public bool TryCreateSerializer(out IHybridCacheSerializer? serializer) + { + serializer = null; + return false; + } + } +} diff --git a/test/UnitTests/UnitTests.csproj b/test/UnitTests/UnitTests.csproj index 9fe12ec..c531e41 100644 --- a/test/UnitTests/UnitTests.csproj +++ b/test/UnitTests/UnitTests.csproj @@ -19,7 +19,7 @@ - + diff --git a/util/NatsAppHost/NatsAppHost.csproj b/util/NatsAppHost/NatsAppHost.csproj index c22a63e..82557d6 100644 --- a/util/NatsAppHost/NatsAppHost.csproj +++ b/util/NatsAppHost/NatsAppHost.csproj @@ -9,7 +9,7 @@ - + diff --git a/util/ReadmeExample/ReadmeExample.csproj b/util/ReadmeExample/ReadmeExample.csproj index 57a8e1b..b662e78 100644 --- a/util/ReadmeExample/ReadmeExample.csproj +++ b/util/ReadmeExample/ReadmeExample.csproj @@ -8,12 +8,11 @@ - - + From 3775f8eb8728e810b976e7c50ce59c881298a154 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sat, 17 May 2025 23:09:17 -0400 Subject: [PATCH 05/10] rename Signed-off-by: Caleb Lloyd --- README.md | 8 ++-- src/NatsDistributedCache/NatsCache.Log.cs | 4 +- src/NatsDistributedCache/NatsCache.cs | 2 +- src/NatsDistributedCache/NatsCacheImpl.cs | 31 ------------ src/NatsDistributedCache/NatsCacheOptions.cs | 2 +- .../NatsDistributedCache.csproj | 6 +-- .../NatsDistributedCacheExtensions.cs | 18 +++---- .../NatsHybridCacheSerializer.cs | 6 ++- src/NatsHybridCache/NatsHybridCache.csproj | 11 +++-- .../NatsHybridCacheExtensions.cs | 4 +- .../packages.linux-x64.lock.json | 22 ++++++++- .../packages.osx-arm64.lock.json | 22 ++++++++- .../packages.win-x64.lock.json | 22 ++++++++- .../Cache/HybridCacheSetAndRemoveTests.cs | 3 +- .../Cache/NatsCacheSetAndRemoveTests.cs | 48 +++++++++---------- .../Cache/TimeExpirationAsyncTests.cs | 36 +++++++------- .../Cache/TimeExpirationTests.cs | 36 +++++++------- test/IntegrationTests/IntegrationTests.csproj | 2 +- test/IntegrationTests/NatsCollection.cs | 2 +- .../NatsIntegrationFixture.cs | 4 +- test/IntegrationTests/TestBase.cs | 9 ++-- .../packages.linux-x64.lock.json | 14 ++++-- .../packages.osx-arm64.lock.json | 14 ++++-- .../packages.win-x64.lock.json | 14 ++++-- test/TestUtils/Assertions/ExceptionAssert.cs | 2 +- test/TestUtils/NatsTestExtensions.cs | 2 +- .../Services/Logging/TestOutputLogger.cs | 2 +- test/TestUtils/TestUtils.csproj | 2 +- test/TestUtils/packages.linux-x64.lock.json | 32 ++++++++----- test/TestUtils/packages.osx-arm64.lock.json | 32 ++++++++----- test/TestUtils/packages.win-x64.lock.json | 32 ++++++++----- .../Cache/TimeExpirationAsyncUnitTests.cs | 4 +- .../Cache/TimeExpirationUnitTests.cs | 4 +- .../NatsDistributedCacheExtensionsTests.cs | 2 +- .../NatsHybridCacheExtensionsTests.cs | 42 +++++----------- .../NatsHybridCacheSerializerFactoryTests.cs | 2 +- test/UnitTests/TestBase.cs | 2 +- test/UnitTests/UnitTests.csproj | 2 +- test/UnitTests/packages.linux-x64.lock.json | 12 +++-- test/UnitTests/packages.osx-arm64.lock.json | 12 +++-- test/UnitTests/packages.win-x64.lock.json | 12 +++-- util/NatsAppHost/NatsAppHost.csproj | 2 +- util/NatsAppHost/packages.linux-x64.lock.json | 32 ++++++++++++- util/NatsAppHost/packages.osx-arm64.lock.json | 32 ++++++++++++- util/NatsAppHost/packages.win-x64.lock.json | 32 ++++++++++++- util/PerfTest/PerfTest.cs | 4 +- util/PerfTest/PerfTest.csproj | 2 +- util/PerfTest/Program.cs | 6 +-- util/PerfTest/Utils/StopwatchPool.cs | 2 +- util/PerfTest/packages.linux-x64.lock.json | 14 ++++-- util/PerfTest/packages.osx-arm64.lock.json | 14 ++++-- util/PerfTest/packages.win-x64.lock.json | 14 ++++-- util/ReadmeExample/Abbreviated.cs | 2 +- util/ReadmeExample/Program.cs | 2 +- util/ReadmeExample/ReadmeExample.csproj | 2 +- .../packages.linux-x64.lock.json | 34 +++++++------ .../packages.osx-arm64.lock.json | 34 +++++++------ util/ReadmeExample/packages.win-x64.lock.json | 34 +++++++------ 58 files changed, 498 insertions(+), 302 deletions(-) delete mode 100644 src/NatsDistributedCache/NatsCacheImpl.cs diff --git a/README.md b/README.md index 1207ed0..1be3603 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![NuGet Version](https://img.shields.io/nuget/v/CodeCargo.Nats.DistributedCache?cacheSeconds=3600&color=516bf1)](https://www.nuget.org/packages/CodeCargo.Nats.DistributedCache/) +[![NuGet Version](https://img.shields.io/nuget/v/CodeCargo.NatsDistributedCache?cacheSeconds=3600&color=516bf1)](https://www.nuget.org/packages/CodeCargo.NatsDistributedCache/) -# CodeCargo.Nats.DistributedCache +# CodeCargo.NatsDistributedCache ## Overview @@ -20,7 +20,7 @@ A .NET 8+ library for integrating NATS as a distributed cache in ASP.NET Core ap ```bash # add NATS Distributed Cache -dotnet add package CodeCargo.Nats.DistributedCache +dotnet add package CodeCargo.NatsDistributedCache # optional - add full NATS.Net (NATS Distributed Cache uses a subset of NATS.Net dependencies) dotnet add package NATS.Net @@ -35,7 +35,7 @@ See the [Full Example here](https://github.com/code-cargo/NatsDistributedCache/t This is the portion for registering services: ```csharp -using CodeCargo.Nats.DistributedCache; +using CodeCargo.NatsDistributedCache; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NATS.Client.Core; diff --git a/src/NatsDistributedCache/NatsCache.Log.cs b/src/NatsDistributedCache/NatsCache.Log.cs index e874e32..4e0df5e 100644 --- a/src/NatsDistributedCache/NatsCache.Log.cs +++ b/src/NatsDistributedCache/NatsCache.Log.cs @@ -1,11 +1,11 @@ using Microsoft.Extensions.Logging; -namespace CodeCargo.Nats.DistributedCache; +namespace CodeCargo.NatsDistributedCache; public partial class NatsCache { private void LogException(Exception exception) => - _logger.LogError(EventIds.Exception, exception, "Exception in NatsCache"); + _logger.LogError(EventIds.Exception, exception, "Exception in NatsDistributedCache"); private void LogConnected(string bucketName) => _logger.LogInformation(EventIds.Connected, "Connected to NATS KV bucket {bucketName}", bucketName); diff --git a/src/NatsDistributedCache/NatsCache.cs b/src/NatsDistributedCache/NatsCache.cs index 57f1c53..851a2a0 100644 --- a/src/NatsDistributedCache/NatsCache.cs +++ b/src/NatsDistributedCache/NatsCache.cs @@ -8,7 +8,7 @@ using NATS.Client.KeyValueStore; using NATS.Net; -namespace CodeCargo.Nats.DistributedCache; +namespace CodeCargo.NatsDistributedCache; /// /// Cache entry for storing in NATS Key-Value Store diff --git a/src/NatsDistributedCache/NatsCacheImpl.cs b/src/NatsDistributedCache/NatsCacheImpl.cs deleted file mode 100644 index dfa9371..0000000 --- a/src/NatsDistributedCache/NatsCacheImpl.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.Extensions.Caching.Hybrid; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using NATS.Client.Core; - -namespace CodeCargo.Nats.DistributedCache -{ - internal sealed class NatsCacheImpl : NatsCache - { - private readonly IServiceProvider _services; - - public NatsCacheImpl( - IOptions optionsAccessor, - ILogger logger, - IServiceProvider services, - INatsConnection natsConnection) - : base(optionsAccessor, logger, natsConnection) => - _services = services; // important: do not check for HybridCache here due to dependency - creates a cycle - - public NatsCacheImpl( - IOptions optionsAccessor, - IServiceProvider services, - INatsConnection natsConnection) - : base(optionsAccessor, natsConnection) => - _services = services; // important: do not check for HybridCache here due to dependency - creates a cycle - - internal override bool IsHybridCacheActive() - => _services.GetService() is not null; - } -} diff --git a/src/NatsDistributedCache/NatsCacheOptions.cs b/src/NatsDistributedCache/NatsCacheOptions.cs index 0f608ad..a5ed557 100644 --- a/src/NatsDistributedCache/NatsCacheOptions.cs +++ b/src/NatsDistributedCache/NatsCacheOptions.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Options; -namespace CodeCargo.Nats.DistributedCache +namespace CodeCargo.NatsDistributedCache { /// /// Configuration options for . diff --git a/src/NatsDistributedCache/NatsDistributedCache.csproj b/src/NatsDistributedCache/NatsDistributedCache.csproj index ba809cd..0dc25d8 100644 --- a/src/NatsDistributedCache/NatsDistributedCache.csproj +++ b/src/NatsDistributedCache/NatsDistributedCache.csproj @@ -3,8 +3,8 @@ true enable - CodeCargo.Nats.DistributedCache - NATS implementation of Microsoft.Extensions.Caching.Distributed.IDistributedCache. + CodeCargo.NatsDistributedCache + NATS implementation of IDistributedCache. true @@ -14,7 +14,7 @@ CodeCargo CodeCargo Copyright © $([System.DateTime]::Now.Year) CodeCargo - CodeCargo.Nats.DistributedCache + CodeCargo.NatsDistributedCache distributed cache;hybrid cache;nats MIT README.md diff --git a/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs index 30c4f3c..0d04afd 100644 --- a/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs +++ b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Options; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache; +namespace CodeCargo.NatsDistributedCache; /// /// Extension methods for setting up NATS distributed cache related services in an . @@ -27,19 +27,19 @@ public static IServiceCollection AddNatsDistributedCache( { services.AddOptions(); services.Configure(configureOptions); - services.Add(ServiceDescriptor.Singleton(serviceProvider => + services.AddSingleton(sp => { - var optionsAccessor = serviceProvider.GetRequiredService>(); - var logger = serviceProvider.GetService>(); + var optionsAccessor = sp.GetRequiredService>(); + var logger = sp.GetService>(); var natsConnection = connectionServiceKey == null - ? serviceProvider.GetRequiredService() - : serviceProvider.GetRequiredKeyedService(connectionServiceKey); + ? sp.GetRequiredService() + : sp.GetRequiredKeyedService(connectionServiceKey); return logger != null - ? new NatsCacheImpl(optionsAccessor, logger, serviceProvider, natsConnection) - : new NatsCacheImpl(optionsAccessor, serviceProvider, natsConnection); - })); + ? new NatsCache(optionsAccessor, logger, natsConnection) + : new NatsCache(optionsAccessor, natsConnection); + }); return services; } diff --git a/src/NatsDistributedCache/NatsHybridCacheSerializer.cs b/src/NatsDistributedCache/NatsHybridCacheSerializer.cs index 40fee09..97e1333 100644 --- a/src/NatsDistributedCache/NatsHybridCacheSerializer.cs +++ b/src/NatsDistributedCache/NatsHybridCacheSerializer.cs @@ -1,9 +1,13 @@ +// even though this is an IHybridCacheSerializer, it's included in Microsoft.Extensions.Caching.Abstractions +// so we can include it in the NatsDistributedCache package instead of NatsHybridCache to give library +// consumers the option to reduce dependencies + using System.Buffers; using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Caching.Hybrid; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache; +namespace CodeCargo.NatsDistributedCache; public readonly struct NatsHybridCacheSerializer(INatsSerialize serializer, INatsDeserialize deserializer) : IHybridCacheSerializer diff --git a/src/NatsHybridCache/NatsHybridCache.csproj b/src/NatsHybridCache/NatsHybridCache.csproj index ec21c08..c6f122a 100644 --- a/src/NatsHybridCache/NatsHybridCache.csproj +++ b/src/NatsHybridCache/NatsHybridCache.csproj @@ -3,18 +3,18 @@ true enable - CodeCargo.Nats.HybridCache - NATS implementation of Microsoft.Extensions.Caching.Hybrid.IHybridCache. + CodeCargo.NatsHybridCache + Extensions for using HybridCache with NATS. - true - $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk + true + $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk CodeCargo CodeCargo Copyright © $([System.DateTime]::Now.Year) CodeCargo - CodeCargo.Nats.HybridCache + CodeCargo.NatsHybridCache distributed cache;hybrid cache;nats MIT README.md @@ -29,6 +29,7 @@ + diff --git a/src/NatsHybridCache/NatsHybridCacheExtensions.cs b/src/NatsHybridCache/NatsHybridCacheExtensions.cs index 8c11b7c..d5e8c49 100644 --- a/src/NatsHybridCache/NatsHybridCacheExtensions.cs +++ b/src/NatsHybridCache/NatsHybridCacheExtensions.cs @@ -1,9 +1,9 @@ -using CodeCargo.Nats.DistributedCache; +using CodeCargo.NatsDistributedCache; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; -namespace CodeCargo.Nats.HybridCache; +namespace CodeCargo.NatsHybridCache; /// /// Extension methods for setting up NATS hybrid cache related services in an . diff --git a/src/NatsHybridCache/packages.linux-x64.lock.json b/src/NatsHybridCache/packages.linux-x64.lock.json index 77b497e..d20df63 100644 --- a/src/NatsHybridCache/packages.linux-x64.lock.json +++ b/src/NatsHybridCache/packages.linux-x64.lock.json @@ -14,6 +14,16 @@ "Microsoft.Extensions.Options": "9.0.4" } }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, "StyleCop.Analyzers": { "type": "Direct", "requested": "[1.2.0-beta.556, )", @@ -23,6 +33,11 @@ "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", "resolved": "9.0.4", @@ -71,6 +86,11 @@ "resolved": "9.0.4", "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, "NATS.Client.Core": { "type": "Transitive", "resolved": "2.6.0", @@ -118,7 +138,7 @@ "resolved": "8.0.5", "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", diff --git a/src/NatsHybridCache/packages.osx-arm64.lock.json b/src/NatsHybridCache/packages.osx-arm64.lock.json index 77b497e..d20df63 100644 --- a/src/NatsHybridCache/packages.osx-arm64.lock.json +++ b/src/NatsHybridCache/packages.osx-arm64.lock.json @@ -14,6 +14,16 @@ "Microsoft.Extensions.Options": "9.0.4" } }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, "StyleCop.Analyzers": { "type": "Direct", "requested": "[1.2.0-beta.556, )", @@ -23,6 +33,11 @@ "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", "resolved": "9.0.4", @@ -71,6 +86,11 @@ "resolved": "9.0.4", "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, "NATS.Client.Core": { "type": "Transitive", "resolved": "2.6.0", @@ -118,7 +138,7 @@ "resolved": "8.0.5", "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", diff --git a/src/NatsHybridCache/packages.win-x64.lock.json b/src/NatsHybridCache/packages.win-x64.lock.json index 77b497e..d20df63 100644 --- a/src/NatsHybridCache/packages.win-x64.lock.json +++ b/src/NatsHybridCache/packages.win-x64.lock.json @@ -14,6 +14,16 @@ "Microsoft.Extensions.Options": "9.0.4" } }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, "StyleCop.Analyzers": { "type": "Direct", "requested": "[1.2.0-beta.556, )", @@ -23,6 +33,11 @@ "StyleCop.Analyzers.Unstable": "1.2.0.556" } }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", "resolved": "9.0.4", @@ -71,6 +86,11 @@ "resolved": "9.0.4", "contentHash": "SPFyMjyku1nqTFFJ928JAMd0QnRe4xjE7KeKnZMWXf3xk+6e0WiOZAluYtLdbJUXtsl2cCRSi8cBquJ408k8RA==" }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, "NATS.Client.Core": { "type": "Transitive", "resolved": "2.6.0", @@ -118,7 +138,7 @@ "resolved": "8.0.5", "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", diff --git a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs index 6c1e792..bd430c5 100644 --- a/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/HybridCacheSetAndRemoveTests.cs @@ -5,9 +5,8 @@ using NATS.Client.Core; using NATS.Client.KeyValueStore; using NATS.Net; -using StreamJsonRpc; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; +namespace CodeCargo.NatsDistributedCache.IntegrationTests.Cache; public class HybridCacheGetSetRemoveTests(NatsIntegrationFixture fixture) : TestBase(fixture) { diff --git a/test/IntegrationTests/Cache/NatsCacheSetAndRemoveTests.cs b/test/IntegrationTests/Cache/NatsCacheSetAndRemoveTests.cs index 2bc7afd..3c1eb67 100644 --- a/test/IntegrationTests/Cache/NatsCacheSetAndRemoveTests.cs +++ b/test/IntegrationTests/Cache/NatsCacheSetAndRemoveTests.cs @@ -1,7 +1,7 @@ using System.Text; using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; +namespace CodeCargo.NatsDistributedCache.IntegrationTests.Cache; public class NatsCacheSetAndRemoveTests(NatsIntegrationFixture fixture) : TestBase(fixture) { @@ -9,7 +9,7 @@ public class NatsCacheSetAndRemoveTests(NatsIntegrationFixture fixture) : TestBa public void GetMissingKeyReturnsNull() { var key = MethodKey(); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Null(result); } @@ -19,9 +19,9 @@ public void SetAndGetReturnsObject() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value); + DistributedCache.Set(key, value); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); } @@ -33,11 +33,11 @@ public void SetAndGetWorksWithCaseSensitiveKeys() var value1 = new byte[] { 1 }; var value2 = new byte[] { 2 }; - Cache.Set(key1, value1); - Cache.Set(key2, value2); + DistributedCache.Set(key1, value1); + DistributedCache.Set(key2, value2); - var result1 = Cache.Get(key1); - var result2 = Cache.Get(key2); + var result1 = DistributedCache.Get(key1); + var result2 = DistributedCache.Get(key2); Assert.Equal(value1, result1); Assert.Equal(value2, result2); @@ -50,10 +50,10 @@ public void SetAlwaysOverwrites() var value1 = new byte[] { 1 }; var value2 = new byte[] { 2 }; - Cache.Set(key, value1); - Cache.Set(key, value2); + DistributedCache.Set(key, value1); + DistributedCache.Set(key, value2); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value2, result); } @@ -63,10 +63,10 @@ public void RemoveRemoves() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value); - Cache.Remove(key); + DistributedCache.Set(key, value); + DistributedCache.Remove(key); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Null(result); } @@ -78,17 +78,17 @@ public void RemoveRemoves() public void SetGetNonNullString(string payload) { var key = MethodKey(); - Cache.Remove(key); // known state - Assert.Null(Cache.Get(key)); // expect null - Cache.SetString(key, payload); + DistributedCache.Remove(key); // known state + Assert.Null(DistributedCache.Get(key)); // expect null + DistributedCache.SetString(key, payload); // check raw bytes - var raw = Cache.Get(key); + var raw = DistributedCache.Get(key); Assert.NotNull(raw); Assert.Equal(Hex(payload), Hex(raw)); // check via string API - var value = Cache.GetString(key); + var value = DistributedCache.GetString(key); Assert.NotNull(value); Assert.Equal(payload, value); } @@ -101,17 +101,17 @@ public void SetGetNonNullString(string payload) public async Task SetGetNonNullStringAsync(string payload) { var key = MethodKey(); - await Cache.RemoveAsync(key); // known state - Assert.Null(await Cache.GetAsync(key)); // expect null - await Cache.SetStringAsync(key, payload); + await DistributedCache.RemoveAsync(key); // known state + Assert.Null(await DistributedCache.GetAsync(key)); // expect null + await DistributedCache.SetStringAsync(key, payload); // check raw bytes - var raw = await Cache.GetAsync(key); + var raw = await DistributedCache.GetAsync(key); Assert.NotNull(raw); Assert.Equal(Hex(payload), Hex(raw)); // check via string API - var value = await Cache.GetStringAsync(key); + var value = await DistributedCache.GetStringAsync(key); Assert.NotNull(value); Assert.Equal(payload, value); } diff --git a/test/IntegrationTests/Cache/TimeExpirationAsyncTests.cs b/test/IntegrationTests/Cache/TimeExpirationAsyncTests.cs index 1453a0c..2578c3a 100644 --- a/test/IntegrationTests/Cache/TimeExpirationAsyncTests.cs +++ b/test/IntegrationTests/Cache/TimeExpirationAsyncTests.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; +namespace CodeCargo.NatsDistributedCache.IntegrationTests.Cache; public class TimeExpirationAsyncTests(NatsIntegrationFixture fixture) : TestBase(fixture) { @@ -10,15 +10,15 @@ public async Task AbsoluteExpirationExpiresAsync() var key = MethodKey(); var value = new byte[1]; - await Cache.SetAsync(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); + await DistributedCache.SetAsync(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); - var result = await Cache.GetAsync(key); + var result = await DistributedCache.GetAsync(key); Assert.Equal(value, result); for (var i = 0; i < 4 && result != null; i++) { await Task.Delay(TimeSpan.FromSeconds(0.5)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); } Assert.Null(result); @@ -30,15 +30,15 @@ public async Task RelativeExpirationExpiresAsync() var key = MethodKey(); var value = new byte[1]; - await Cache.SetAsync(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); + await DistributedCache.SetAsync(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); - var result = await Cache.GetAsync(key); + var result = await DistributedCache.GetAsync(key); Assert.Equal(value, result); for (var i = 0; i < 4 && result != null; i++) { await Task.Delay(TimeSpan.FromSeconds(0.5)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); } Assert.Null(result); @@ -50,14 +50,14 @@ public async Task SlidingExpirationExpiresIfNotAccessedAsync() var key = MethodKey(); var value = new byte[1]; - await Cache.SetAsync(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); + await DistributedCache.SetAsync(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); - var result = await Cache.GetAsync(key); + var result = await DistributedCache.GetAsync(key); Assert.Equal(value, result); await Task.Delay(TimeSpan.FromSeconds(3)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); Assert.Null(result); } @@ -67,23 +67,23 @@ public async Task SlidingExpirationRenewedByAccessAsync() var key = MethodKey(); var value = new byte[1]; - await Cache.SetAsync(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); + await DistributedCache.SetAsync(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); - var result = await Cache.GetAsync(key); + var result = await DistributedCache.GetAsync(key); Assert.Equal(value, result); for (var i = 0; i < 5; i++) { await Task.Delay(TimeSpan.FromSeconds(0.5)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); Assert.NotNull(result); Assert.Equal(value, result); } await Task.Delay(TimeSpan.FromSeconds(3)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); Assert.Null(result); } @@ -93,19 +93,19 @@ public async Task SlidingExpirationRenewedByAccessUntilAbsoluteExpirationAsync() var key = MethodKey(); var value = new byte[1]; - await Cache.SetAsync(key, value, new DistributedCacheEntryOptions() + await DistributedCache.SetAsync(key, value, new DistributedCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(1.1)) .SetAbsoluteExpiration(TimeSpan.FromSeconds(4))); var setTime = DateTime.Now; - var result = await Cache.GetAsync(key); + var result = await DistributedCache.GetAsync(key); Assert.Equal(value, result); for (var i = 0; i < 4; i++) { await Task.Delay(TimeSpan.FromSeconds(0.5)); - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); Assert.NotNull(result); Assert.Equal(value, result); } @@ -115,7 +115,7 @@ public async Task SlidingExpirationRenewedByAccessUntilAbsoluteExpirationAsync() await Task.Delay(TimeSpan.FromSeconds(0.5)); } - result = await Cache.GetAsync(key); + result = await DistributedCache.GetAsync(key); Assert.Null(result); } } diff --git a/test/IntegrationTests/Cache/TimeExpirationTests.cs b/test/IntegrationTests/Cache/TimeExpirationTests.cs index faf7154..1d480e0 100644 --- a/test/IntegrationTests/Cache/TimeExpirationTests.cs +++ b/test/IntegrationTests/Cache/TimeExpirationTests.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests.Cache; +namespace CodeCargo.NatsDistributedCache.IntegrationTests.Cache; public class TimeExpirationTests(NatsIntegrationFixture fixture) : TestBase(fixture) { @@ -10,15 +10,15 @@ public void AbsoluteExpirationExpires() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); + DistributedCache.Set(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); for (var i = 0; i < 4 && result != null; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); - result = Cache.Get(key); + result = DistributedCache.Get(key); } Assert.Null(result); @@ -30,15 +30,15 @@ public void RelativeExpirationExpires() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); + DistributedCache.Set(key, value, new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(1.1))); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); for (var i = 0; i < 4 && result != null; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); - result = Cache.Get(key); + result = DistributedCache.Get(key); } Assert.Null(result); @@ -50,14 +50,14 @@ public void SlidingExpirationExpiresIfNotAccessed() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); + DistributedCache.Set(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); Thread.Sleep(TimeSpan.FromSeconds(3)); - result = Cache.Get(key); + result = DistributedCache.Get(key); Assert.Null(result); } @@ -67,23 +67,23 @@ public void SlidingExpirationRenewedByAccess() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); + DistributedCache.Set(key, value, new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(1))); - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); for (var i = 0; i < 5; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); - result = Cache.Get(key); + result = DistributedCache.Get(key); Assert.NotNull(result); Assert.Equal(value, result); } Thread.Sleep(TimeSpan.FromSeconds(3)); - result = Cache.Get(key); + result = DistributedCache.Get(key); Assert.Null(result); } @@ -93,19 +93,19 @@ public void SlidingExpirationRenewedByAccessUntilAbsoluteExpiration() var key = MethodKey(); var value = new byte[1]; - Cache.Set(key, value, new DistributedCacheEntryOptions() + DistributedCache.Set(key, value, new DistributedCacheEntryOptions() .SetSlidingExpiration(TimeSpan.FromSeconds(1.1)) .SetAbsoluteExpiration(TimeSpan.FromSeconds(4))); var setTime = DateTime.Now; - var result = Cache.Get(key); + var result = DistributedCache.Get(key); Assert.Equal(value, result); for (var i = 0; i < 4; i++) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); - result = Cache.Get(key); + result = DistributedCache.Get(key); Assert.NotNull(result); Assert.Equal(value, result); } @@ -115,7 +115,7 @@ public void SlidingExpirationRenewedByAccessUntilAbsoluteExpiration() Thread.Sleep(TimeSpan.FromSeconds(0.5)); } - result = Cache.Get(key); + result = DistributedCache.Get(key); Assert.Null(result); } } diff --git a/test/IntegrationTests/IntegrationTests.csproj b/test/IntegrationTests/IntegrationTests.csproj index 4f76501..bf450dd 100644 --- a/test/IntegrationTests/IntegrationTests.csproj +++ b/test/IntegrationTests/IntegrationTests.csproj @@ -5,7 +5,7 @@ true $(MSBuildProjectDirectory)\..\xunit.runsettings Exe - CodeCargo.Nats.DistributedCache.IntegrationTests + CodeCargo.NatsDistributedCache.IntegrationTests diff --git a/test/IntegrationTests/NatsCollection.cs b/test/IntegrationTests/NatsCollection.cs index 2cd4dc8..2ff557c 100644 --- a/test/IntegrationTests/NatsCollection.cs +++ b/test/IntegrationTests/NatsCollection.cs @@ -1,4 +1,4 @@ -namespace CodeCargo.Nats.DistributedCache.IntegrationTests; +namespace CodeCargo.NatsDistributedCache.IntegrationTests; [CollectionDefinition(Name)] public class NatsCollection : ICollectionFixture diff --git a/test/IntegrationTests/NatsIntegrationFixture.cs b/test/IntegrationTests/NatsIntegrationFixture.cs index 1a079f5..bb9c35c 100644 --- a/test/IntegrationTests/NatsIntegrationFixture.cs +++ b/test/IntegrationTests/NatsIntegrationFixture.cs @@ -1,11 +1,11 @@ using Aspire.Hosting; -using CodeCargo.Nats.DistributedCache.TestUtils; +using CodeCargo.NatsDistributedCache.TestUtils; using Microsoft.Extensions.Logging; using NATS.Client.Core; using NATS.Client.KeyValueStore; using NATS.Net; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests; +namespace CodeCargo.NatsDistributedCache.IntegrationTests; /// /// Test fixture that starts an Aspire-hosted NATS server for integration tests diff --git a/test/IntegrationTests/TestBase.cs b/test/IntegrationTests/TestBase.cs index a20255a..935ee2f 100644 --- a/test/IntegrationTests/TestBase.cs +++ b/test/IntegrationTests/TestBase.cs @@ -1,15 +1,14 @@ using System.Runtime.CompilerServices; -using CodeCargo.Nats.DistributedCache.TestUtils; -using CodeCargo.Nats.DistributedCache.TestUtils.Services.Logging; +using CodeCargo.NatsDistributedCache.TestUtils; +using CodeCargo.NatsDistributedCache.TestUtils.Services.Logging; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.Logging; using NATS.Client.Core; using NATS.Client.JetStream.Models; -using NATS.Client.KeyValueStore; using NATS.Net; -namespace CodeCargo.Nats.DistributedCache.IntegrationTests; +namespace CodeCargo.NatsDistributedCache.IntegrationTests; /// /// Base class for NATS integration tests that provides test output logging and fixture access @@ -63,7 +62,7 @@ protected TestBase(NatsIntegrationFixture fixture) /// /// Gets the cache from the service provider /// - protected IDistributedCache Cache => ServiceProvider.GetRequiredService(); + protected IDistributedCache DistributedCache => ServiceProvider.GetRequiredService(); /// /// Gets the cache from the service provider diff --git a/test/IntegrationTests/packages.linux-x64.lock.json b/test/IntegrationTests/packages.linux-x64.lock.json index 987977f..086b1fc 100644 --- a/test/IntegrationTests/packages.linux-x64.lock.json +++ b/test/IntegrationTests/packages.linux-x64.lock.json @@ -1075,7 +1075,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -1084,20 +1084,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.linux-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.linux-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/IntegrationTests/packages.osx-arm64.lock.json b/test/IntegrationTests/packages.osx-arm64.lock.json index 16bcfb7..157193a 100644 --- a/test/IntegrationTests/packages.osx-arm64.lock.json +++ b/test/IntegrationTests/packages.osx-arm64.lock.json @@ -1075,7 +1075,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -1084,20 +1084,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.osx-arm64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.osx-arm64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/IntegrationTests/packages.win-x64.lock.json b/test/IntegrationTests/packages.win-x64.lock.json index d7512b1..b9bca80 100644 --- a/test/IntegrationTests/packages.win-x64.lock.json +++ b/test/IntegrationTests/packages.win-x64.lock.json @@ -1075,7 +1075,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -1084,20 +1084,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.win-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.win-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/TestUtils/Assertions/ExceptionAssert.cs b/test/TestUtils/Assertions/ExceptionAssert.cs index 56a5123..9910482 100644 --- a/test/TestUtils/Assertions/ExceptionAssert.cs +++ b/test/TestUtils/Assertions/ExceptionAssert.cs @@ -1,6 +1,6 @@ using Xunit; -namespace CodeCargo.Nats.DistributedCache.TestUtils.Assertions; +namespace CodeCargo.NatsDistributedCache.TestUtils.Assertions; public static class ExceptionAssert { diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index f486080..6638872 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -2,7 +2,7 @@ using NATS.Client.Core; using NATS.Client.Hosting; -namespace CodeCargo.Nats.DistributedCache.TestUtils; +namespace CodeCargo.NatsDistributedCache.TestUtils; public static class NatsTestExtensions { diff --git a/test/TestUtils/Services/Logging/TestOutputLogger.cs b/test/TestUtils/Services/Logging/TestOutputLogger.cs index 2ffe069..de246db 100644 --- a/test/TestUtils/Services/Logging/TestOutputLogger.cs +++ b/test/TestUtils/Services/Logging/TestOutputLogger.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Logging; using Xunit; -namespace CodeCargo.Nats.DistributedCache.TestUtils.Services.Logging; +namespace CodeCargo.NatsDistributedCache.TestUtils.Services.Logging; /// /// Extension methods for configuring logging in test context diff --git a/test/TestUtils/TestUtils.csproj b/test/TestUtils/TestUtils.csproj index f24ebb1..d98d8b0 100644 --- a/test/TestUtils/TestUtils.csproj +++ b/test/TestUtils/TestUtils.csproj @@ -1,7 +1,7 @@ - CodeCargo.Nats.DistributedCache.TestUtils + CodeCargo.NatsDistributedCache.TestUtils diff --git a/test/TestUtils/packages.linux-x64.lock.json b/test/TestUtils/packages.linux-x64.lock.json index 7890c9e..ee104af 100644 --- a/test/TestUtils/packages.linux-x64.lock.json +++ b/test/TestUtils/packages.linux-x64.lock.json @@ -2,18 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -78,6 +66,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -261,7 +260,7 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -269,6 +268,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/test/TestUtils/packages.osx-arm64.lock.json b/test/TestUtils/packages.osx-arm64.lock.json index 7890c9e..ee104af 100644 --- a/test/TestUtils/packages.osx-arm64.lock.json +++ b/test/TestUtils/packages.osx-arm64.lock.json @@ -2,18 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -78,6 +66,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -261,7 +260,7 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -269,6 +268,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/test/TestUtils/packages.win-x64.lock.json b/test/TestUtils/packages.win-x64.lock.json index 7890c9e..ee104af 100644 --- a/test/TestUtils/packages.win-x64.lock.json +++ b/test/TestUtils/packages.win-x64.lock.json @@ -2,18 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[9.0.4, )", @@ -78,6 +66,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -261,7 +260,7 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -269,6 +268,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/test/UnitTests/Cache/TimeExpirationAsyncUnitTests.cs b/test/UnitTests/Cache/TimeExpirationAsyncUnitTests.cs index 2285175..1875731 100644 --- a/test/UnitTests/Cache/TimeExpirationAsyncUnitTests.cs +++ b/test/UnitTests/Cache/TimeExpirationAsyncUnitTests.cs @@ -1,7 +1,7 @@ -using CodeCargo.Nats.DistributedCache.TestUtils.Assertions; +using CodeCargo.NatsDistributedCache.TestUtils.Assertions; using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.UnitTests.Cache; +namespace CodeCargo.NatsDistributedCache.UnitTests.Cache; public class TimeExpirationAsyncUnitTests : TestBase { diff --git a/test/UnitTests/Cache/TimeExpirationUnitTests.cs b/test/UnitTests/Cache/TimeExpirationUnitTests.cs index 689be07..d2a5f64 100644 --- a/test/UnitTests/Cache/TimeExpirationUnitTests.cs +++ b/test/UnitTests/Cache/TimeExpirationUnitTests.cs @@ -1,7 +1,7 @@ -using CodeCargo.Nats.DistributedCache.TestUtils.Assertions; +using CodeCargo.NatsDistributedCache.TestUtils.Assertions; using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.UnitTests.Cache; +namespace CodeCargo.NatsDistributedCache.UnitTests.Cache; public class TimeExpirationUnitTests : TestBase { diff --git a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs index c0a0f6e..ea86376 100644 --- a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs @@ -4,7 +4,7 @@ using Moq; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache.UnitTests.Extensions; +namespace CodeCargo.NatsDistributedCache.UnitTests.Extensions; public class CacheServiceExtensionsUnitTests { diff --git a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs index 598a365..1e6b75f 100644 --- a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -1,16 +1,19 @@ -using CodeCargo.Nats.HybridCache; +using CodeCargo.NatsHybridCache; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Moq; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache.UnitTests.Extensions; +namespace CodeCargo.NatsDistributedCache.UnitTests.Extensions; public class NatsHybridCacheExtensionsTests { private readonly Mock _mockNatsConnection = new(); + public NatsHybridCacheExtensionsTests() => + _mockNatsConnection.SetupGet(m => m.Opts).Returns(NatsOpts.Default); + [Fact] public void AddNatsHybridCache_RegistersSerializerFactoryAsSingleton() { @@ -22,9 +25,9 @@ public void AddNatsHybridCache_RegistersSerializerFactoryAsSingleton() options.BucketName = "cache"; }); - var registration = services.FirstOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); + var registration = services.LastOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); Assert.NotNull(registration); - Assert.Equal(ServiceLifetime.Singleton, registration!.Lifetime); + Assert.Equal(ServiceLifetime.Singleton, registration.Lifetime); } [Fact] @@ -33,12 +36,10 @@ public void AddNatsHybridCache_ReplacesPreviouslyUserRegisteredServices() var services = new ServiceCollection(); services.AddSingleton(_mockNatsConnection.Object); services.AddSingleton(new FakeHybridCacheSerializerFactory()); - services.AddNatsHybridCache(options => { options.BucketName = "cache"; }); - var provider = services.BuildServiceProvider(); var factory = provider.GetRequiredService(); @@ -80,7 +81,7 @@ public void AddNatsHybridCache_UsesCacheOptionsAction() }); var sp = services.BuildServiceProvider(); - _ = sp.GetRequiredService(); + _ = sp.GetRequiredService(); Assert.True(wasInvoked); } @@ -99,38 +100,21 @@ public void AddNatsHybridCache_AcceptsConnectionServiceKey_Parameter() options => { options.BucketName = "cache"; }, connectionServiceKey: "my-key"); - var cacheReg = services.FirstOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); + var cacheReg = services.LastOrDefault(d => d.ServiceType == typeof(IHybridCacheSerializerFactory)); Assert.NotNull(cacheReg); - Assert.Equal(ServiceLifetime.Singleton, cacheReg!.Lifetime); + Assert.Equal(ServiceLifetime.Singleton, cacheReg.Lifetime); Assert.Null(cacheReg.ImplementationType); Assert.NotNull(cacheReg.ImplementationFactory); - var optionsReg = services.FirstOrDefault(d => d.ServiceType == typeof(IConfigureOptions)); + var optionsReg = services.LastOrDefault(d => d.ServiceType == typeof(IConfigureOptions)); Assert.NotNull(optionsReg); } - [Fact] - public void AddNatsHybridCacheSerializerFactory_AddsSerializerFactory() - { - var builderMock = new Mock(); - var registry = NatsOpts.Default.SerializerRegistry; - - builderMock - .Setup(b => b.AddSerializerFactory(It.IsAny())) - .Returns(builderMock.Object) - .Verifiable(); - - var result = builderMock.Object.AddNatsHybridCacheSerializerFactory(registry); - - builderMock.Verify(b => b.AddSerializerFactory(It.IsAny()), Times.Once); - Assert.Equal(builderMock.Object, result); - } - private class FakeHybridCacheSerializerFactory : IHybridCacheSerializerFactory { - public bool TryCreateSerializer(out IHybridCacheSerializer? serializer) + public bool TryCreateSerializer(out IHybridCacheSerializer serializer) { - serializer = null; + serializer = null!; return false; } } diff --git a/test/UnitTests/Serialization/NatsHybridCacheSerializerFactoryTests.cs b/test/UnitTests/Serialization/NatsHybridCacheSerializerFactoryTests.cs index a823224..857db36 100644 --- a/test/UnitTests/Serialization/NatsHybridCacheSerializerFactoryTests.cs +++ b/test/UnitTests/Serialization/NatsHybridCacheSerializerFactoryTests.cs @@ -2,7 +2,7 @@ using Moq; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache.UnitTests.Serialization; +namespace CodeCargo.NatsDistributedCache.UnitTests.Serialization; /// /// Tests for the NatsHybridCacheSerializerFactory diff --git a/test/UnitTests/TestBase.cs b/test/UnitTests/TestBase.cs index 99dc103..764fd3b 100644 --- a/test/UnitTests/TestBase.cs +++ b/test/UnitTests/TestBase.cs @@ -5,7 +5,7 @@ using Moq; using NATS.Client.Core; -namespace CodeCargo.Nats.DistributedCache.UnitTests; +namespace CodeCargo.NatsDistributedCache.UnitTests; public abstract class TestBase { diff --git a/test/UnitTests/UnitTests.csproj b/test/UnitTests/UnitTests.csproj index c531e41..3f6dcb5 100644 --- a/test/UnitTests/UnitTests.csproj +++ b/test/UnitTests/UnitTests.csproj @@ -5,7 +5,7 @@ true $(MSBuildProjectDirectory)\..\xunit.runsettings Exe - CodeCargo.Nats.DistributedCache.UnitTests + CodeCargo.NatsDistributedCache.UnitTests diff --git a/test/UnitTests/packages.linux-x64.lock.json b/test/UnitTests/packages.linux-x64.lock.json index 2d24c70..5ffc617 100644 --- a/test/UnitTests/packages.linux-x64.lock.json +++ b/test/UnitTests/packages.linux-x64.lock.json @@ -392,7 +392,7 @@ "xunit.v3.runner.common": "[2.0.2]" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -401,11 +401,17 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/UnitTests/packages.osx-arm64.lock.json b/test/UnitTests/packages.osx-arm64.lock.json index 2d24c70..5ffc617 100644 --- a/test/UnitTests/packages.osx-arm64.lock.json +++ b/test/UnitTests/packages.osx-arm64.lock.json @@ -392,7 +392,7 @@ "xunit.v3.runner.common": "[2.0.2]" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -401,11 +401,17 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/test/UnitTests/packages.win-x64.lock.json b/test/UnitTests/packages.win-x64.lock.json index 2d24c70..5ffc617 100644 --- a/test/UnitTests/packages.win-x64.lock.json +++ b/test/UnitTests/packages.win-x64.lock.json @@ -392,7 +392,7 @@ "xunit.v3.runner.common": "[2.0.2]" } }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -401,11 +401,17 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/NatsAppHost/NatsAppHost.csproj b/util/NatsAppHost/NatsAppHost.csproj index 82557d6..4949fee 100644 --- a/util/NatsAppHost/NatsAppHost.csproj +++ b/util/NatsAppHost/NatsAppHost.csproj @@ -5,7 +5,7 @@ true Exe - CodeCargo.Nats.DistributedCache.NatsAppHost + CodeCargo.NatsDistributedCache.NatsAppHost diff --git a/util/NatsAppHost/packages.linux-x64.lock.json b/util/NatsAppHost/packages.linux-x64.lock.json index 61d3339..999a325 100644 --- a/util/NatsAppHost/packages.linux-x64.lock.json +++ b/util/NatsAppHost/packages.linux-x64.lock.json @@ -244,6 +244,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration": { "type": "Transitive", "resolved": "8.0.0", @@ -711,7 +734,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -719,6 +742,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/util/NatsAppHost/packages.osx-arm64.lock.json b/util/NatsAppHost/packages.osx-arm64.lock.json index 6382e51..41129ff 100644 --- a/util/NatsAppHost/packages.osx-arm64.lock.json +++ b/util/NatsAppHost/packages.osx-arm64.lock.json @@ -244,6 +244,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration": { "type": "Transitive", "resolved": "8.0.0", @@ -711,7 +734,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -719,6 +742,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/util/NatsAppHost/packages.win-x64.lock.json b/util/NatsAppHost/packages.win-x64.lock.json index e305cad..eb45bef 100644 --- a/util/NatsAppHost/packages.win-x64.lock.json +++ b/util/NatsAppHost/packages.win-x64.lock.json @@ -244,6 +244,29 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, "Microsoft.Extensions.Configuration": { "type": "Transitive", "resolved": "8.0.0", @@ -711,7 +734,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -719,6 +742,13 @@ "Microsoft.Extensions.Options": "[9.0.4, )", "NATS.Client.KeyValueStore": "[2.6.0, )" } + }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } } } } diff --git a/util/PerfTest/PerfTest.cs b/util/PerfTest/PerfTest.cs index f2ffaec..94df899 100644 --- a/util/PerfTest/PerfTest.cs +++ b/util/PerfTest/PerfTest.cs @@ -1,8 +1,8 @@ using System.Diagnostics; -using CodeCargo.Nats.DistributedCache.PerfTest.Utils; +using CodeCargo.NatsDistributedCache.PerfTest.Utils; using Microsoft.Extensions.Caching.Distributed; -namespace CodeCargo.Nats.DistributedCache.PerfTest; +namespace CodeCargo.NatsDistributedCache.PerfTest; public class PerfTest { diff --git a/util/PerfTest/PerfTest.csproj b/util/PerfTest/PerfTest.csproj index 2a2e423..e3d6ad7 100644 --- a/util/PerfTest/PerfTest.csproj +++ b/util/PerfTest/PerfTest.csproj @@ -3,7 +3,7 @@ false Exe - CodeCargo.Nats.DistributedCache.PerfTest + CodeCargo.NatsDistributedCache.PerfTest diff --git a/util/PerfTest/Program.cs b/util/PerfTest/Program.cs index bb8c6ab..5e34a8d 100644 --- a/util/PerfTest/Program.cs +++ b/util/PerfTest/Program.cs @@ -1,8 +1,8 @@ using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Testing; -using CodeCargo.Nats.DistributedCache; -using CodeCargo.Nats.DistributedCache.PerfTest; -using CodeCargo.Nats.DistributedCache.TestUtils; +using CodeCargo.NatsDistributedCache; +using CodeCargo.NatsDistributedCache.PerfTest; +using CodeCargo.NatsDistributedCache.TestUtils; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NATS.Client.Core; diff --git a/util/PerfTest/Utils/StopwatchPool.cs b/util/PerfTest/Utils/StopwatchPool.cs index 7a8896b..dd07e4b 100644 --- a/util/PerfTest/Utils/StopwatchPool.cs +++ b/util/PerfTest/Utils/StopwatchPool.cs @@ -1,7 +1,7 @@ using System.Buffers; using System.Diagnostics; -namespace CodeCargo.Nats.DistributedCache.PerfTest.Utils +namespace CodeCargo.NatsDistributedCache.PerfTest.Utils { /// /// Provides a pooled Stopwatch to reduce allocations in performance-critical code diff --git a/util/PerfTest/packages.linux-x64.lock.json b/util/PerfTest/packages.linux-x64.lock.json index babef24..6db67f1 100644 --- a/util/PerfTest/packages.linux-x64.lock.json +++ b/util/PerfTest/packages.linux-x64.lock.json @@ -967,7 +967,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -976,20 +976,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.linux-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.linux-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/PerfTest/packages.osx-arm64.lock.json b/util/PerfTest/packages.osx-arm64.lock.json index 0b0278b..aa0e2bb 100644 --- a/util/PerfTest/packages.osx-arm64.lock.json +++ b/util/PerfTest/packages.osx-arm64.lock.json @@ -967,7 +967,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -976,20 +976,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.osx-arm64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.osx-arm64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/PerfTest/packages.win-x64.lock.json b/util/PerfTest/packages.win-x64.lock.json index 55d0a36..dc7ae25 100644 --- a/util/PerfTest/packages.win-x64.lock.json +++ b/util/PerfTest/packages.win-x64.lock.json @@ -967,7 +967,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -976,20 +976,26 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.win-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.win-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } }, "testutils": { "type": "Project", "dependencies": { - "CodeCargo.Nats.DistributedCache": "[1.0.0, )", - "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )", + "CodeCargo.NatsHybridCache": "[1.0.0, )", "Microsoft.Extensions.Logging": "[9.0.4, )", "NATS.Net": "[2.6.0, )", "xunit.v3.assert": "[2.0.2, )", diff --git a/util/ReadmeExample/Abbreviated.cs b/util/ReadmeExample/Abbreviated.cs index 8c6132f..e0f9fd1 100644 --- a/util/ReadmeExample/Abbreviated.cs +++ b/util/ReadmeExample/Abbreviated.cs @@ -1,4 +1,4 @@ -using CodeCargo.Nats.DistributedCache; +using CodeCargo.NatsDistributedCache; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using NATS.Client.Core; diff --git a/util/ReadmeExample/Program.cs b/util/ReadmeExample/Program.cs index 1c9bc46..535efbc 100644 --- a/util/ReadmeExample/Program.cs +++ b/util/ReadmeExample/Program.cs @@ -1,6 +1,6 @@ using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Testing; -using CodeCargo.Nats.DistributedCache; +using CodeCargo.NatsDistributedCache; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; diff --git a/util/ReadmeExample/ReadmeExample.csproj b/util/ReadmeExample/ReadmeExample.csproj index b662e78..9cff2a1 100644 --- a/util/ReadmeExample/ReadmeExample.csproj +++ b/util/ReadmeExample/ReadmeExample.csproj @@ -3,7 +3,7 @@ false Exe - CodeCargo.Nats.DistributedCache.ReadmeExample + CodeCargo.NatsDistributedCache.ReadmeExample diff --git a/util/ReadmeExample/packages.linux-x64.lock.json b/util/ReadmeExample/packages.linux-x64.lock.json index 626d822..bc0b728 100644 --- a/util/ReadmeExample/packages.linux-x64.lock.json +++ b/util/ReadmeExample/packages.linux-x64.lock.json @@ -36,18 +36,6 @@ "System.IO.Hashing": "9.0.3" } }, - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -313,6 +301,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -947,7 +946,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -956,13 +955,20 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.linux-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.linux-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } } } diff --git a/util/ReadmeExample/packages.osx-arm64.lock.json b/util/ReadmeExample/packages.osx-arm64.lock.json index f79dff7..16363ed 100644 --- a/util/ReadmeExample/packages.osx-arm64.lock.json +++ b/util/ReadmeExample/packages.osx-arm64.lock.json @@ -36,18 +36,6 @@ "System.IO.Hashing": "9.0.3" } }, - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -313,6 +301,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -947,7 +946,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -956,13 +955,20 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.osx-arm64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.osx-arm64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } } } diff --git a/util/ReadmeExample/packages.win-x64.lock.json b/util/ReadmeExample/packages.win-x64.lock.json index 2ae6083..fa266c7 100644 --- a/util/ReadmeExample/packages.win-x64.lock.json +++ b/util/ReadmeExample/packages.win-x64.lock.json @@ -36,18 +36,6 @@ "System.IO.Hashing": "9.0.3" } }, - "Microsoft.Extensions.Caching.Hybrid": { - "type": "Direct", - "requested": "[9.4.0, )", - "resolved": "9.4.0", - "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "9.0.4", - "Microsoft.Extensions.Caching.Memory": "9.0.4", - "Microsoft.Extensions.Logging.Abstractions": "9.0.4", - "Microsoft.Extensions.Options": "9.0.4" - } - }, "NATS.Net": { "type": "Direct", "requested": "[2.6.0, )", @@ -313,6 +301,17 @@ "Microsoft.Extensions.Primitives": "9.0.4" } }, + "Microsoft.Extensions.Caching.Hybrid": { + "type": "Transitive", + "resolved": "9.4.0", + "contentHash": "GtHP+DRraRM6RLq7TzUV8Iiyqm+WemJRLDNqy7uvA+Dgf6fjvxpmHnzgPb+RAcRNjADz961DMHHZ4i5EQjpDPw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4" + } + }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", "resolved": "9.0.4", @@ -947,7 +946,7 @@ "resolved": "16.3.0", "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, - "CodeCargo.Nats.DistributedCache": { + "CodeCargo.NatsDistributedCache": { "type": "Project", "dependencies": { "Microsoft.Extensions.Caching.Abstractions": "[9.0.4, )", @@ -956,13 +955,20 @@ "NATS.Client.KeyValueStore": "[2.6.0, )" } }, + "CodeCargo.NatsHybridCache": { + "type": "Project", + "dependencies": { + "CodeCargo.NatsDistributedCache": "[1.0.0, )", + "Microsoft.Extensions.Caching.Hybrid": "[9.4.0, )" + } + }, "natsapphost": { "type": "Project", "dependencies": { "Aspire.Dashboard.Sdk.win-x64": "[9.2.1, )", "Aspire.Hosting.AppHost": "[9.2.1, )", "Aspire.Hosting.Orchestration.win-x64": "[9.2.1, )", - "CodeCargo.Nats.DistributedCache": "[1.0.0, )" + "CodeCargo.NatsHybridCache": "[1.0.0, )" } } } From fd227835b28d5982ef8c6a60a5bf271da56966d0 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd <2414837+caleblloyd@users.noreply.github.com> Date: Sat, 17 May 2025 23:19:00 -0400 Subject: [PATCH 06/10] Add ConfigureAwait to async call (#19) --- src/NatsDistributedCache/NatsCache.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NatsDistributedCache/NatsCache.cs b/src/NatsDistributedCache/NatsCache.cs index 851a2a0..61940d6 100644 --- a/src/NatsDistributedCache/NatsCache.cs +++ b/src/NatsDistributedCache/NatsCache.cs @@ -243,7 +243,7 @@ private Lazy> CreateLazyKvStore() => try { var kv = _natsConnection.CreateKeyValueStoreContext(); - var store = await kv.GetStoreAsync(_bucketName); + var store = await kv.GetStoreAsync(_bucketName).ConfigureAwait(false); LogConnected(_bucketName); return store; } From b9c7d312496e3d3ef7d0e1aa1d6bbe4f0961d965 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd <2414837+caleblloyd@users.noreply.github.com> Date: Sat, 17 May 2025 23:23:13 -0400 Subject: [PATCH 07/10] test: increase extension coverage (#20) --- .../NatsDistributedCacheExtensionsTests.cs | 30 ++++++++++++++ .../NatsHybridCacheExtensionsTests.cs | 39 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs index ea86376..28c6063 100644 --- a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using System.Buffers; using Moq; using NATS.Client.Core; @@ -130,6 +131,35 @@ public void AddNatsCache_AcceptsConnectionServiceKey_Parameter() Assert.NotNull(optionsRegistration); } + [Fact] + public void AddNatsCache_ReturnsServiceCollection() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + + var result = services.AddNatsDistributedCache(options => options.BucketName = "cache"); + + Assert.Same(services, result); + } + + [Fact] + public void ToHybridCacheSerializerFactory_CreatesWorkingFactory() + { + var registry = NatsOpts.Default.SerializerRegistry; + + var factory = registry.ToHybridCacheSerializerFactory(); + + Assert.NotNull(factory); + var created = factory.TryCreateSerializer(out var serializer); + Assert.True(created); + + const string value = "hello"; + var writer = new ArrayBufferWriter(); + serializer!.Serialize(value, writer); + var seq = new ReadOnlySequence(writer.WrittenMemory); + Assert.Equal(value, serializer.Deserialize(seq)); + } + private class FakeDistributedCache : IDistributedCache { public byte[] Get(string key) => throw new NotImplementedException(); diff --git a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs index 1e6b75f..e5c8571 100644 --- a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using System.Collections.Generic; using Moq; using NATS.Client.Core; @@ -110,6 +111,32 @@ public void AddNatsHybridCache_AcceptsConnectionServiceKey_Parameter() Assert.NotNull(optionsReg); } + [Fact] + public void AddNatsHybridCache_ReturnsBuilderWithServices() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + + var builder = services.AddNatsHybridCache(o => o.BucketName = "cache"); + + Assert.NotNull(builder); + Assert.Same(services, builder.Services); + } + + [Fact] + public void AddNatsHybridCacheSerializerFactory_RegistersFactory() + { + var builder = new FakeHybridCacheBuilder(); + var registry = NatsOpts.Default.SerializerRegistry; + + var result = builder.AddNatsHybridCacheSerializerFactory(registry); + + Assert.Same(builder, result); + Assert.Single(builder.Factories); + Assert.True(builder.Factories[0].TryCreateSerializer(out var serializer)); + Assert.NotNull(serializer); + } + private class FakeHybridCacheSerializerFactory : IHybridCacheSerializerFactory { public bool TryCreateSerializer(out IHybridCacheSerializer serializer) @@ -118,4 +145,16 @@ public bool TryCreateSerializer(out IHybridCacheSerializer serializer) return false; } } + + private class FakeHybridCacheBuilder : IHybridCacheBuilder + { + public IServiceCollection Services { get; } = new ServiceCollection(); + public List Factories { get; } = new(); + + public IHybridCacheBuilder AddSerializerFactory(IHybridCacheSerializerFactory factory) + { + Factories.Add(factory); + return this; + } + } } From 6a0cead8f40128c48a56109caf7709c80a4ba222 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd <2414837+caleblloyd@users.noreply.github.com> Date: Sat, 17 May 2025 23:23:22 -0400 Subject: [PATCH 08/10] Use AddNatsHybridCache in test utilities (#21) --- test/TestUtils/NatsTestExtensions.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index 6638872..0e03cae 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; using NATS.Client.Hosting; +using CodeCargo.NatsHybridCache; namespace CodeCargo.NatsDistributedCache.TestUtils; @@ -16,13 +17,12 @@ options with public static IServiceCollection AddHybridCacheTestClient(this IServiceCollection services) { - // Add HybridCache - var hybridCacheServices = services.AddHybridCache(); + // Add the NATS hybrid cache with default options + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + }); - // Use NATS Serializer for HybridCache - var natsOpts = NatsOpts.Default; - hybridCacheServices.AddSerializerFactory( - natsOpts.SerializerRegistry.ToHybridCacheSerializerFactory()); return services; } } From 11b3b236bba03967248f5edb2e94cb735a7fff85 Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sat, 17 May 2025 23:41:43 -0400 Subject: [PATCH 09/10] remove dupicative test Signed-off-by: Caleb Lloyd --- test/TestUtils/NatsTestExtensions.cs | 2 +- .../NatsDistributedCacheExtensionsTests.cs | 2 +- .../NatsHybridCacheExtensionsTests.cs | 17 ++--------------- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/test/TestUtils/NatsTestExtensions.cs b/test/TestUtils/NatsTestExtensions.cs index 0e03cae..8ae547d 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -1,7 +1,7 @@ +using CodeCargo.NatsHybridCache; using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; using NATS.Client.Hosting; -using CodeCargo.NatsHybridCache; namespace CodeCargo.NatsDistributedCache.TestUtils; diff --git a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs index 28c6063..cf47416 100644 --- a/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs @@ -1,7 +1,7 @@ +using System.Buffers; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using System.Buffers; using Moq; using NATS.Client.Core; diff --git a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs index e5c8571..511ed26 100644 --- a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -1,8 +1,8 @@ +using System.Collections.Generic; using CodeCargo.NatsHybridCache; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using System.Collections.Generic; using Moq; using NATS.Client.Core; @@ -123,20 +123,6 @@ public void AddNatsHybridCache_ReturnsBuilderWithServices() Assert.Same(services, builder.Services); } - [Fact] - public void AddNatsHybridCacheSerializerFactory_RegistersFactory() - { - var builder = new FakeHybridCacheBuilder(); - var registry = NatsOpts.Default.SerializerRegistry; - - var result = builder.AddNatsHybridCacheSerializerFactory(registry); - - Assert.Same(builder, result); - Assert.Single(builder.Factories); - Assert.True(builder.Factories[0].TryCreateSerializer(out var serializer)); - Assert.NotNull(serializer); - } - private class FakeHybridCacheSerializerFactory : IHybridCacheSerializerFactory { public bool TryCreateSerializer(out IHybridCacheSerializer serializer) @@ -149,6 +135,7 @@ public bool TryCreateSerializer(out IHybridCacheSerializer serializer) private class FakeHybridCacheBuilder : IHybridCacheBuilder { public IServiceCollection Services { get; } = new ServiceCollection(); + public List Factories { get; } = new(); public IHybridCacheBuilder AddSerializerFactory(IHybridCacheSerializerFactory factory) From 42e87fde0b1f8a4a84272e1410fcdb6c13b80eae Mon Sep 17 00:00:00 2001 From: Caleb Lloyd Date: Sat, 17 May 2025 23:55:54 -0400 Subject: [PATCH 10/10] cleanup Signed-off-by: Caleb Lloyd --- .../Extensions/NatsHybridCacheExtensionsTests.cs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs index 511ed26..29514b5 100644 --- a/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -1,4 +1,3 @@ -using System.Collections.Generic; using CodeCargo.NatsHybridCache; using Microsoft.Extensions.Caching.Hybrid; using Microsoft.Extensions.DependencyInjection; @@ -131,17 +130,4 @@ public bool TryCreateSerializer(out IHybridCacheSerializer serializer) return false; } } - - private class FakeHybridCacheBuilder : IHybridCacheBuilder - { - public IServiceCollection Services { get; } = new ServiceCollection(); - - public List Factories { get; } = new(); - - public IHybridCacheBuilder AddSerializerFactory(IHybridCacheSerializerFactory factory) - { - Factories.Add(factory); - return this; - } - } }