diff --git a/src/Immediate.Cache.Shared/ApplicationCache.cs b/src/Immediate.Cache.Shared/ApplicationCache.cs index 18ba9e8..319e218 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(); @@ -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; } /// 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; + } +}