asp.net-mvc - 如何在 ASP.NET MVC 中缓存对象?

标签 asp.net-mvc caching

我想在 ASP.NET MVC 中缓存对象。我有一个 BaseController 我希望所有 Controller 都继承它。在 BaseController 中,有一个 User 属性,它将简单地从数据库中获取用户数据,以便我可以在 Controller 中使用它,或将其传递给 View 。

我想缓存此信息。我在每个页面上都使用此信息,因此无需每个页面请求都访问数据库。

我想要这样的东西:

if(_user is null)
  GrabFromDatabase
  StuffIntoCache
return CachedObject as User

如何在 ASP.NET MVC 中实现简单的缓存?

最佳答案

您仍然可以使用缓存(在所有响应之间共享)和 session (每个用户唯一)进行存储。

我喜欢以下“尝试从缓存获取/创建并存储”模式(类似 C# 的伪代码):

public static class CacheExtensions
{
  public static T GetOrStore<T>(this Cache cache, string key, Func<T> generator)
  {
    var result = cache[key];
    if(result == null)
    {
      result = generator();
      cache[key] = result;
    }
    return (T)result;
  }
}

你可以像这样使用它:

var user = HttpRuntime
              .Cache
              .GetOrStore<User>(
                 $"User{_userId}", 
                 () => Repository.GetUser(_userId));

您可以将此模式应用于 session 、ViewState(呃)或任何其他缓存机制。您还可以扩展 ControllerContext.HttpContext (我认为它是 System.Web.Extensions 中的包装器之一),或者创建一个新类来完成此操作,并留出一些空间来模拟缓存。

关于asp.net-mvc - 如何在 ASP.NET MVC 中缓存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/445050/

相关文章:

asp.net-mvc - jquery在发布到服务器后无法在asp.net mvc中工作

c# - 通过在列表中循环列表 c# 获取总和

asp.net-mvc - EF Code FIrst和数据库优先模型的差异

asp.net-mvc - 如何在未经授权的情况下重定向到登录屏幕,同时在 MVC 中返回 401 状态代码?

php - 为什么服务器有时会提供错误版本的网页?

php - YII框架正在缓存css文件

ruby-on-rails - 如何强制清除 Rails SQL 缓存?

c# - 如何返回 JSON 或 RedirectToAction?

caching - 将查询中的缓存设置为false后,Elasticsearch是否将删除现有的过滤器缓存

java - 定期缓存并上传到服务器