src/React.AspNet.Middleware/MemoryFileCacheCore.cs (47 lines of code) (raw):
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Caching.Memory;
using System.Linq;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.FileProviders;
#if NETCOREAPP2_0 || NETSTANDARD2_0
using IWebHostEnvironment = Microsoft.AspNetCore.Hosting.IHostingEnvironment;
#endif
namespace React.AspNet
{
/// <summary>
/// Memory cache implementation for React.ICache. Uses IMemoryCache from .NET Core.
/// </summary>
public class MemoryFileCacheCore : ICache
{
private readonly IMemoryCache _cache;
private readonly IWebHostEnvironment _hostingEnv;
/// <summary>
/// Initializes a new instance of the <see cref="MemoryFileCacheCore" /> class.
/// </summary>
/// <param name="cache">The cache to use</param>
/// <param name="hostingEnv">The ASP.NET hosting environment.</param>
public MemoryFileCacheCore(IMemoryCache cache, IWebHostEnvironment hostingEnv)
{
_cache = cache;
_hostingEnv = hostingEnv;
}
/// <summary>
/// Get an item from the cache. Returns <paramref name="fallback"/> if the item does
/// not exist.
/// </summary>
/// <typeparam name="T">Type of data</typeparam>
/// <param name="key">The cache key</param>
/// <param name="fallback">Value to return if item is not in the cache</param>
/// <returns>Data from cache, otherwise <paramref name="fallback"/></returns>
public T Get<T>(string key, T fallback = default(T))
{
return (T)(_cache.Get(key) ?? fallback);
}
/// <summary>
/// Sets an item in the cache.
/// </summary>
/// <typeparam name="T">Type of data</typeparam>
/// <param name="key">The cache key</param>
/// <param name="data">Data to cache</param>
/// <param name="slidingExpiration">
/// Sliding expiration, if cache key is not accessed in this time period it will
/// automatically be removed from the cache
/// </param>
/// <param name="cacheDependencyFiles">
/// Filenames this cached item is dependent on. If any of these files change, the cache
/// will be cleared automatically
/// </param>
public void Set<T>(string key, T data, TimeSpan slidingExpiration, IEnumerable<string> cacheDependencyFiles = null)
{
if (data == null)
{
_cache.Remove(key);
return;
}
var options = new MemoryCacheEntryOptions
{
SlidingExpiration = slidingExpiration,
};
if (cacheDependencyFiles != null)
{
foreach (var file in cacheDependencyFiles)
{
var relativePath = file.Replace(_hostingEnv.WebRootPath, string.Empty).TrimStart('\\', '/');
options.AddExpirationToken(_hostingEnv.WebRootFileProvider.Watch(relativePath));
}
}
_cache.Set(key, data, options);
}
}
}