在过去的 100 年中取得了很大进展。前段时间,我相信在 ASP.NET 1.0 中,ASP classic 中的 Application 对象被 caching 所取代(尽管 Application 对象被保留是为了向后兼容 ASP classic)。
AspNetCore 具有replaced the caching mechanism of ASP.NET 并使其对 DI 友好,但它仍然与 ASP.NET 中的事物状态非常相似。主要区别在于您现在需要注入它而不是使用静态 HttpContext.Current.Cache 属性。
启动时注册缓存...
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvcWithDefaultRoute();
}
}
你可以像...一样注入它
public class HomeController : Controller
{
private IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
string companyName = _cache[CacheKeys.CompanyName] as string;
return View();
}
然后,要使其在应用程序范围内工作,您可以使用 filter 或 middleware 并结合某种缓存刷新模式:
- 尝试从缓存中获取值
- 如果尝试失败
- 返回值
public string GetCompanyName()
{
string result;
// Look for cache key.
if (!_cache.TryGetValue(CacheKeys.CompanyName, out result))
{
// Key not in cache, so get data.
result = // Lookup data from db
// Set cache options.
var cacheEntryOptions = new MemoryCacheEntryOptions()
// Keep in cache for this time, reset time if accessed.
.SetSlidingExpiration(TimeSpan.FromMinutes(60));
// Save data in cache.
_cache.Set(CacheKeys.CompanyName, result, cacheEntryOptions);
}
return result;
}
当然,您可以清理它并创建一个具有强类型属性的服务,作为注入到控制器中的缓存的包装器,但这是一般的想法。
注意还有一个distributed cache,以防您想在网络服务器之间共享数据。
您可以选择使用静态方法或静态注册的类实例,但请注意,如果托管在 IIS 上,静态将每次应用程序池回收时超出范围。因此,要实现这一点,您需要确保使用类似的刷新模式重新填充数据。
主要区别在于缓存有超时设置,可用于优化数据应在缓存中存储多长时间(硬时间限制或滑动到期)。