Nextended.Cache
10.1.32
See the version list below for details.
dotnet add package Nextended.Cache --version 10.1.32
NuGet\Install-Package Nextended.Cache -Version 10.1.32
<PackageReference Include="Nextended.Cache" Version="10.1.32" />
<PackageVersion Include="Nextended.Cache" Version="10.1.32" />
<PackageReference Include="Nextended.Cache" />
paket add Nextended.Cache --version 10.1.32
#r "nuget: Nextended.Cache, 10.1.32"
#:package Nextended.Cache@10.1.32
#addin nuget:?package=Nextended.Cache&version=10.1.32
#tool nuget:?package=Nextended.Cache&version=10.1.32
![]()
Nextended.Cache
Expression-based caching โ automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting.
๐ Documentation: English ยท Deutsch
Installation
dotnet add package Nextended.Cache
The idea
Most caching code is the same four lines: build a key, look it up, run the expensive thing, store it. The key is where it goes wrong โ it is written by hand, it forgets a parameter, and two call sites disagree.
Nextended.Cache derives the key from the call expression instead. You hand it the call you
would have made, and the key is built from the declaring type, the result type, the method name
and the actual argument values.
Quick start
Cache a method call without naming a key
using Nextended.Cache;
public class UserService
{
private readonly CacheProvider _cache = new();
public User GetUser(int userId)
// The lambda receives the instance, so the expression can be inspected.
=> _cache.ExecuteWithCache(this, self => self.LoadUserFromDb(userId));
private User LoadUserFromDb(int userId) => /* the expensive call */;
}
The generated key looks like
MyApp.UserService_MyApp.User=UserService.LoadUserFromDb(userId=42) โ a different userId
is a different entry, automatically.
Important The lambda body must be a method call.
self => self.Propertyor a closure with no call (() => Load(id)) cannot be turned into a key and will throw anInvalidCastException.
Straight onto IMemoryCache
using Nextended.Cache.Extensions;
var info = this.ExecuteWithCache(memoryCache, self => self.LoadReport(reportId));
info.Result; // the value
info.Key; // the generated key
info.IsNewEntry; // false when it came from the cache
ExecuteWithCache also accepts an explicit key when you want one, and a
MemoryCacheEntryOptions for expiration and priority. cache.MemoryCacheEntryOptions(token)
builds a sensible default (normal priority, one-hour absolute expiration, bound to a
cancellation token).
Condition-based invalidation
CacheProvider can watch itself and drop everything when a condition turns true. Conditions are
evaluated on a background task every ClearCheckInterval (default 10 minutes).
var cache = new CacheProvider();
cache.ClearCheckInterval = TimeSpan.FromMinutes(1);
cache.ClearWhen(c => (DateTime.Now - c.LastWriteTime).TotalHours > 1)
.ClearWhen(c => c.Count() > 10_000);
cache.Cleared += (_, _) => logger.LogInformation("cache dropped");
Clear() works by cancelling an expiration token that every entry is registered against, so a
clear is O(1) rather than an enumeration.
Thread-safe ObjectCache initialisation
For System.Runtime.Caching, AddOrGetExisting wraps the factory in a Lazy<T> so the
expensive call runs exactly once even under concurrent access โ the classic
AddOrGetExisting returns the existing entry after your factory already ran.
using System.Runtime.Caching;
using Nextended.Cache.Extensions;
var rates = MemoryCache.Default.AddOrGetExisting(
"exchange-rates",
() => LoadExchangeRates(),
DateTimeOffset.Now.AddMinutes(10));
Configuration
var cache = new CacheProvider(
memoryCache,
new MemoryCacheEntryOptions()
.SetPriority(CacheItemPriority.High)
.SetAbsoluteExpiration(TimeSpan.FromMinutes(15)));
| Member | Purpose |
|---|---|
CacheEntryOptions |
Default entry options for everything this provider stores |
ClearCheckInterval |
How often the ClearWhen predicates are evaluated |
LastWriteTime |
Timestamp of the last new entry โ the usual input for a ClearWhen predicate |
Count() |
Current entry count |
Clear() |
Drop everything and raise Cleared |
Cleared |
Event raised after a clear |
Supported frameworks
net8.0net9.0net10.0
Dependencies
The Nextended family
The other 17 packages in the suite:
Core libraries
- Nextended.Core โ Foundation library โ extension methods, custom types (Money, Date, BaseId, SuperType), class mapping, deep clone, encryption, hashing and the code-generation attributes.
- Nextended.Cache โ Expression-based caching โ automatic cache keys from method expressions, CacheProvider with condition-based invalidation, thread-safe AddOrGetExisting. (this package)
Data access
- Nextended.EF โ Entity Framework Core extensions โ graph loading (LoadGraphAsync, IncludeAll, MultiInclude), declarative include definitions, paging, dynamic sorting and bulk operations.
ASP.NET Core & web
- Nextended.Web โ ASP.NET Core utilities โ zero-config OData (AddODataAuto), composable IQueryable OData appliers, strongly typed controller URLs, streaming download helpers and a background executor that can replay a captured request.
- Nextended.ResponseFilters โ Fluent, provider-agnostic pipeline that redacts, masks, rounds, truncates, hashes, prunes and restructures response DTOs before serialization โ per request, per user, per permission.
- Nextended.ResponseFilters.AspNetCore โ ASP.NET Core adapter for Nextended.ResponseFilters โ registers the pipeline as a global IAsyncResultFilter and replays structural edits against the serialized JSON tree.
UI libraries
- Nextended.Blazor โ Blazor helpers โ IBrowserFile extensions (bytes, data URLs, downloads), a hierarchical model for browsing inside uploaded zip/tar/rar archives, MIME-type detection and component-parameter reflection.
- Nextended.UI โ WPF and Windows desktop helpers โ a global input-binding manager with hold/sequence matching, DirectInput and XInput gamepad readers, key-bind capture controls, converters, behaviours, markup extensions and runtime-defined PropertyGrid types.
Code generation & tooling
- Nextended.Imaging โ Image processing โ aspect-preserving resize, crop, colour replacement, brightness-based foreground picking, thumbnail generation, byte/data-URL conversion and MIME detection from magic bytes.
- Nextended.CodeGen โ Roslyn source generator โ DTOs and interfaces from your entities, strongly typed classes from JSON/XML, lookup tables from Excel, and documentation from source files.
.NET Aspire hosting
- Nextended.Aspire โ Conditional AppHost builder extensions โ WithReferenceIf / WaitForIf / WithExplicitStartIf, strongly typed environment variables from config objects, HTTPS dev-cert wiring, Docker guards, GitHub-source resources and npm app discovery.
- Nextended.Aspire.Hosting.Supabase โ The complete Supabase stack โ Postgres, Auth (GoTrue), REST, Realtime, Storage, Studio, Kong and Edge Functions โ as one composable Aspire resource.
- Nextended.Aspire.Hosting.N8n โ The n8n workflow-automation platform as an Aspire resource, with Postgres persistence, workflow import and a typed client for triggering workflows from .NET.
- Nextended.Aspire.Hosting.Grafana โ Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter and the OpenTelemetry Collector as composable resources with auto-provisioned datasources.
- Nextended.Aspire.Hosting.WebDataStudio โ WebDataStudio โ a browser database studio for PostgreSQL, MySQL, SQL Server, SQLite, Oracle, DuckDB, ClickHouse, MongoDB and Redis โ wired to the databases of your stack.
- Nextended.Aspire.Hosting.AspireUI โ AspireUI โ the visual AppHost builder โ as a resource inside your own Aspire stack, with an optional pre-seeded admin user and a starter stack built from your project paths.
- Nextended.Aspire.Hosting.LocalAI โ Self-hosted, OpenAI-compatible multimodal AI โ image generation, text-to-speech, speech-to-text and video โ with gallery model management, GPU support and Open WebUI.
- Nextended.Aspire.Hosting.Php โ Run PHP endpoints inside your Aspire stack โ a docroot folder or a single router script served by PHP's built-in web server, with php.ini settings as fluent options.
Links
- ๐ฆ NuGet package
- ๐ Documentation โ English
- ๐ Dokumentation โ Deutsch
- ๐ Documentation portal
- ๐งโ๐ป Source code
- ๐ Report an issue
License
GPL-3.0-or-later โ see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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
- Microsoft.Extensions.Caching.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Caching.Memory (>= 10.0.8)
- Microsoft.Extensions.Options (>= 10.0.8)
- Nextended.Core (>= 10.1.32)
- System.Runtime.Caching (>= 10.0.8)
-
net8.0
- Microsoft.Extensions.Caching.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Caching.Memory (>= 8.0.1)
- Microsoft.Extensions.Options (>= 8.0.2)
- Nextended.Core (>= 10.1.32)
- System.Runtime.Caching (>= 8.0.0)
-
net9.0
- Microsoft.Extensions.Caching.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Caching.Memory (>= 9.0.10)
- Microsoft.Extensions.Options (>= 9.0.10)
- Nextended.Core (>= 10.1.32)
- System.Runtime.Caching (>= 9.0.10)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Nextended.Cache:
| Package | Downloads |
|---|---|
|
Nextended.Imaging
Provides a simple ImageHelper class to deal with images This package is the new version of Nextended.Image nExt was renamed to Nextended |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.1.34 | 38 | 8/27/2026 |
| 10.1.33 | 97 | 8/24/2026 |
| 10.1.32 | 105 | 8/20/2026 |
| 10.1.31 | 102 | 8/19/2026 |
| 10.1.30 | 96 | 8/19/2026 |
| 10.1.21 | 119 | 7/30/2026 |
| 10.1.20 | 123 | 7/26/2026 |
| 10.1.19 | 121 | 7/23/2026 |
| 10.1.18 | 121 | 7/22/2026 |
| 10.1.17 | 119 | 7/21/2026 |
| 10.1.16 | 118 | 7/21/2026 |
| 10.1.15 | 117 | 7/21/2026 |
| 10.1.14 | 122 | 7/16/2026 |
| 10.1.13 | 125 | 7/12/2026 |
| 10.1.12 | 119 | 7/12/2026 |
| 10.1.11 | 134 | 7/6/2026 |
| 10.1.10 | 137 | 6/16/2026 |
| 10.1.9 | 139 | 5/29/2026 |
| 10.1.8 | 142 | 5/19/2026 |
| 10.1.7 | 143 | 5/16/2026 |