Pinguteca.Sdk.Core.Caching
0.4.0
dotnet add package Pinguteca.Sdk.Core.Caching --version 0.4.0
NuGet\Install-Package Pinguteca.Sdk.Core.Caching -Version 0.4.0
<PackageReference Include="Pinguteca.Sdk.Core.Caching" Version="0.4.0" />
<PackageVersion Include="Pinguteca.Sdk.Core.Caching" Version="0.4.0" />
<PackageReference Include="Pinguteca.Sdk.Core.Caching" />
paket add Pinguteca.Sdk.Core.Caching --version 0.4.0
#r "nuget: Pinguteca.Sdk.Core.Caching, 0.4.0"
#:package Pinguteca.Sdk.Core.Caching@0.4.0
#addin nuget:?package=Pinguteca.Sdk.Core.Caching&version=0.4.0
#tool nuget:?package=Pinguteca.Sdk.Core.Caching&version=0.4.0
Pinguteca.Sdk.Core.Caching
Response-caching gRPC client interceptor for Pinguteca SDK clients.
Layer 3 companion to Pinguteca.Sdk.Core.
Cross-SDK contract pinned in RFC 0015: schema-driven per-method opt-in, content-hashed cache keys (SHA-256, FIPS 180-4 approved), default-deny tenant-scope isolation, TTL plus ETag plus write-triggered invalidation, opt-in stale-while-revalidate and negative caching, default-on single-flight, and streaming pass-through.
Ships as L3 because realistic cache stores (Redis, etc.) are third-party dependencies the core SDK does not require.
Install
dotnet add package Pinguteca.Sdk.Core.Caching
What ships
CachingInterceptorwraps unary gRPC calls; streams pass through.ICacheinterface withMemoryCacheLRU+TTL+SWR default.CacheSpecdescribing TTL, SWR, negative TTL, and write-method invalidation lists.CachingOptionswithKeyScopehook (required, default-deny),MethodConfigmap, and optionalILoggersink for hit/miss outcomes.
Quickstart
using Grpc.Core.Interceptors;
using Grpc.Net.Client;
using Pinguteca.Sdk.Core.Caching;
var cache = new MemoryCache(1024);
var interceptor = new CachingInterceptor(new()
{
Store = cache,
KeyScope = ctx => "tenant-a",
MethodConfig =
{
["/user.v1.UserService/GetUser"] = new CacheSpec { Ttl = TimeSpan.FromMinutes(1) },
["/user.v1.UserService/UpdateUser"] = new CacheSpec { Invalidates = ["GetUser"] },
},
});
var channel = GrpcChannel.ForAddress("https://api.example.com");
var invoker = channel.Intercept(interceptor);
var client = new UserService.UserServiceClient(invoker);
Multi-tenant deployments wire KeyScope to extract a tenant
identifier from ClientInterceptorContext.Options.Headers or
application context. Single-tenant deployments wire
KeyScope = _ => "" to opt into empty scope with explicit
acknowledgement.
Docs
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Google.Protobuf (>= 3.34.1)
- Grpc.Core.Api (>= 2.80.0)
- Grpc.Net.Client (>= 2.80.0)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.4.0 | 88 | 6/7/2026 |