From 273f017adc0c655cde38f7ffbacba027b4831f68 Mon Sep 17 00:00:00 2001 From: Stuart Turner Date: Mon, 20 Jul 2026 10:51:10 -0500 Subject: [PATCH 1/2] Add support for nullable request/response --- .../ApplicationCache.cs | 4 ++-- .../NullableTypesCache.cs | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 tests/Immediate.Cache.FunctionalTests/NullableTypesCache.cs diff --git a/src/Immediate.Cache.Shared/ApplicationCache.cs b/src/Immediate.Cache.Shared/ApplicationCache.cs index 18ba9e8..ce13529 100644 --- a/src/Immediate.Cache.Shared/ApplicationCache.cs +++ b/src/Immediate.Cache.Shared/ApplicationCache.cs @@ -23,8 +23,8 @@ public abstract class ApplicationCache( IMemoryCache memoryCache, Owned> handler ) - where TRequest : class - where TResponse : class + where TRequest : class? + where TResponse : class? { private readonly Lock _lock = new(); diff --git a/tests/Immediate.Cache.FunctionalTests/NullableTypesCache.cs b/tests/Immediate.Cache.FunctionalTests/NullableTypesCache.cs new file mode 100644 index 0000000..0473d6b --- /dev/null +++ b/tests/Immediate.Cache.FunctionalTests/NullableTypesCache.cs @@ -0,0 +1,23 @@ +using Immediate.Cache.Shared; +using Immediate.Handlers.Shared; + +namespace Immediate.Cache.FunctionalTests; + +[CacheFor] +public sealed partial class NullableTypesCache +{ + protected override string TransformKey(NullableTypesHandler.Query? request) => + $"NullableTypesHandler(query: {request})"; +} + +[Handler] +public sealed partial class NullableTypesHandler +{ + public sealed record Query; + public sealed record Response; + + private async ValueTask HandleAsync(Query? _, CancellationToken __) + { + return null; + } +} From 86e7e69f44113deb1174ff4a17a05e76c231ebda Mon Sep 17 00:00:00 2001 From: Stuart Turner Date: Mon, 20 Jul 2026 11:03:26 -0500 Subject: [PATCH 2/2] Update expectations to match constraints --- src/Immediate.Cache.Shared/ApplicationCache.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Immediate.Cache.Shared/ApplicationCache.cs b/src/Immediate.Cache.Shared/ApplicationCache.cs index ce13529..319e218 100644 --- a/src/Immediate.Cache.Shared/ApplicationCache.cs +++ b/src/Immediate.Cache.Shared/ApplicationCache.cs @@ -57,8 +57,6 @@ protected virtual MemoryCacheEntryOptions GetCacheEntryOptions() => private CacheValue GetCacheValue(TRequest request) { - ArgumentNullException.ThrowIfNull(request); - var key = TransformKey(request); if (!memoryCache.TryGetValue(key, out var result)) @@ -76,7 +74,10 @@ private CacheValue GetCacheValue(TRequest request) } } - return (CacheValue)result!; + if (result is not CacheValue cacheValue) + throw new InvalidOperationException($"An unknown type has been stored as the cache value for key `{key}`; Immediate.Cache is unable to operate."); + + return cacheValue; } ///