首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中缓存对象?

如何在ASP.NET MVC中缓存对象?
EN

Stack Overflow用户
提问于 2018-12-05 01:48:08
回答 2查看 0关注 0票数 0

我想在ASP.NET MVC中缓存对象。我有一个BaseController我希望所有控制器继承自己的东西。在BaseController中有一个User属性,它只是从数据库中获取用户数据,以便我可以在控制器中使用它,或将其传递给视图。

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

代码语言:javascript
复制
if(_user is null)
  GrabFromDatabase
  StuffIntoCache
return CachedObject as User

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

EN

回答 2

Stack Overflow用户

发布于 2018-12-05 10:10:46

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

我喜欢以下“尝试从缓存/创建和存储”模式(c#-like伪代码):

代码语言:javascript
复制
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;
  }
}

这样使用:

代码语言:javascript
复制
var user = HttpRuntime
              .Cache
              .GetOrStore<User>(
                 $"User{_userId}", 
                 () => Repository.GetUser(_userId));

您可以将此模式调整为Session,ViewState(ugh)或任何其他缓存机制。您还可以扩展ControllerContext.HttpContext(我认为它是System.Web.Extensions中的包装器之一),或者创建一个新类来实现它,以便模拟缓存。

票数 0
EN

Stack Overflow用户

发布于 2018-12-05 11:02:10

如果您希望将其缓存为请求的长度,请将其放在控制器基类中:

代码语言:javascript
复制
public User User {
    get {
        User _user = ControllerContext.HttpContext.Items["user"] as User;

        if (_user == null) {
            _user = _repository.Get<User>(id);
            ControllerContext.HttpContext.Items["user"] = _user;
        }

        return _user;
    }
}

如果要缓存更长时间,请使用将ControllerContext调用替换为Cache []。如果您确实选择使用Cache对象进行更长时间的缓存,则需要使用唯一的缓存密钥,因为它将在请求/用户之间共享。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档