/// <summary> /// Gets the item expiration. /// </summary> /// <param name="item">The item.</param> /// <returns>Returns the updated cache item.</returns> /// <exception cref="System.ArgumentNullException">If item is null.</exception> /// <exception cref="System.InvalidOperationException"> /// If expiration mode is defined without timeout. /// </exception> protected virtual ICacheItem <TKey, TValue> GetItemExpiration(ICacheItem <TKey, TValue> item) { NotNull(item, nameof(item)); // logic should be that the item setting overrules the handle setting if the item // doesn't define a mode (value is Default) it should use the handle's setting. if the // handle also doesn't define a mode (value is None|Default), we use None. var expirationMode = ExpirationMode.Default; var expirationTimeout = TimeSpan.Zero; var useItemExpiration = item.ExpirationMode != ExpirationMode.Default && !item.UsesExpirationDefaults; if (useItemExpiration) { expirationMode = item.ExpirationMode; expirationTimeout = item.ExpirationTimeout; } else if (Configuration.ExpirationMode != ExpirationMode.Default) { expirationMode = Configuration.ExpirationMode; expirationTimeout = Configuration.ExpirationTimeout; } if (expirationMode == ExpirationMode.Default || expirationMode == ExpirationMode.None) { expirationMode = ExpirationMode.None; expirationTimeout = TimeSpan.Zero; } else if (expirationTimeout == TimeSpan.Zero) { throw new InvalidOperationException("Expiration mode is defined without timeout."); } return(item.WithExpiration(expirationMode, expirationTimeout, !useItemExpiration)); }