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/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..61940d6 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 @@ -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; } 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 617e9ab..0dc25d8 100644 --- a/src/NatsDistributedCache/NatsDistributedCache.csproj +++ b/src/NatsDistributedCache/NatsDistributedCache.csproj @@ -3,18 +3,18 @@ true enable - CodeCargo.Nats.DistributedCache - NATS implementation of Microsoft.Extensions.Caching.Distributed.IDistributedCache. + CodeCargo.NatsDistributedCache + NATS implementation of IDistributedCache. true $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk - + 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/NatsCacheServiceCollectionExtensions.cs b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs similarity index 73% rename from src/NatsDistributedCache/NatsCacheServiceCollectionExtensions.cs rename to src/NatsDistributedCache/NatsDistributedCacheExtensions.cs index 2cea755..0d04afd 100644 --- a/src/NatsDistributedCache/NatsCacheServiceCollectionExtensions.cs +++ b/src/NatsDistributedCache/NatsDistributedCacheExtensions.cs @@ -5,12 +5,12 @@ 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 . /// -public static class NatsCacheServiceCollectionExtensions +public static class NatsDistributedCacheExtensions { /// /// Adds NATS distributed caching services to the specified . @@ -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 new file mode 100644 index 0000000..c6f122a --- /dev/null +++ b/src/NatsHybridCache/NatsHybridCache.csproj @@ -0,0 +1,43 @@ + + + + true + enable + CodeCargo.NatsHybridCache + Extensions for using HybridCache with NATS. + + + true + $(MSBuildThisFileDirectory)..\..\keys\NatsDistributedCache.2025-05-12.snk + + + CodeCargo + CodeCargo + Copyright © $([System.DateTime]::Now.Year) CodeCargo + CodeCargo.NatsHybridCache + 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..d5e8c49 --- /dev/null +++ b/src/NatsHybridCache/NatsHybridCacheExtensions.cs @@ -0,0 +1,52 @@ +using CodeCargo.NatsDistributedCache; +using Microsoft.Extensions.Caching.Hybrid; +using Microsoft.Extensions.DependencyInjection; +using NATS.Client.Core; + +namespace CodeCargo.NatsHybridCache; + +/// +/// Extension methods for setting up NATS hybrid cache related services in an . +/// +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); + var builder = services.AddHybridCache(); + builder.Services.AddSingleton(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) => + 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..d20df63 --- /dev/null +++ b/src/NatsHybridCache/packages.linux-x64.lock.json @@ -0,0 +1,152 @@ +{ + "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.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, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "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", + "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==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "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.NatsDistributedCache": { + "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..d20df63 --- /dev/null +++ b/src/NatsHybridCache/packages.osx-arm64.lock.json @@ -0,0 +1,152 @@ +{ + "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.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, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "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", + "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==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "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.NatsDistributedCache": { + "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..d20df63 --- /dev/null +++ b/src/NatsHybridCache/packages.win-x64.lock.json @@ -0,0 +1,152 @@ +{ + "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.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, )", + "resolved": "1.2.0-beta.556", + "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==", + "dependencies": { + "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", + "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==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "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.NatsDistributedCache": { + "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/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 0003c5e..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 @@ -20,7 +20,7 @@ - + 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..8ae547d 100644 --- a/test/TestUtils/NatsTestExtensions.cs +++ b/test/TestUtils/NatsTestExtensions.cs @@ -1,8 +1,9 @@ +using CodeCargo.NatsHybridCache; using Microsoft.Extensions.DependencyInjection; using NATS.Client.Core; using NATS.Client.Hosting; -namespace CodeCargo.Nats.DistributedCache.TestUtils; +namespace CodeCargo.NatsDistributedCache.TestUtils; public static class NatsTestExtensions { @@ -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; } } 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 0c13076..d98d8b0 100644 --- a/test/TestUtils/TestUtils.csproj +++ b/test/TestUtils/TestUtils.csproj @@ -1,11 +1,10 @@ - CodeCargo.Nats.DistributedCache.TestUtils + CodeCargo.NatsDistributedCache.TestUtils - @@ -13,7 +12,7 @@ - + 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/CacheServiceExtensionsTests.cs b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs similarity index 84% rename from test/UnitTests/Extensions/CacheServiceExtensionsTests.cs rename to test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs index c0a0f6e..cf47416 100644 --- a/test/UnitTests/Extensions/CacheServiceExtensionsTests.cs +++ b/test/UnitTests/Extensions/NatsDistributedCacheExtensionsTests.cs @@ -1,10 +1,11 @@ +using System.Buffers; using Microsoft.Extensions.Caching.Distributed; 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 CacheServiceExtensionsUnitTests { @@ -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 new file mode 100644 index 0000000..29514b5 --- /dev/null +++ b/test/UnitTests/Extensions/NatsHybridCacheExtensionsTests.cs @@ -0,0 +1,133 @@ +using CodeCargo.NatsHybridCache; +using Microsoft.Extensions.Caching.Hybrid; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Moq; +using NATS.Client.Core; + +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() + { + var services = new ServiceCollection(); + services.AddSingleton(_mockNatsConnection.Object); + + services.AddNatsHybridCache(options => + { + options.BucketName = "cache"; + }); + + var registration = services.LastOrDefault(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.LastOrDefault(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.LastOrDefault(d => d.ServiceType == typeof(IConfigureOptions)); + 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); + } + + private class FakeHybridCacheSerializerFactory : IHybridCacheSerializerFactory + { + public bool TryCreateSerializer(out IHybridCacheSerializer serializer) + { + 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 9fe12ec..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 @@ -19,7 +19,7 @@ - + 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 c22a63e..4949fee 100644 --- a/util/NatsAppHost/NatsAppHost.csproj +++ b/util/NatsAppHost/NatsAppHost.csproj @@ -5,11 +5,11 @@ 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 57a8e1b..9cff2a1 100644 --- a/util/ReadmeExample/ReadmeExample.csproj +++ b/util/ReadmeExample/ReadmeExample.csproj @@ -3,17 +3,16 @@ 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, )" } } }