我想在ASP.NET MVC中缓存对象。我有一个BaseController
我希望所有控制器继承自己的东西。在BaseController中有一个User
属性,它只是从数据库中获取用户数据,以便我可以在控制器中使用它,或将其传递给视图。
我想缓存这些信息。我在每个页面上都使用此信息,因此无需每个页面请求转到数据库。
if(_user is null)
GrabFromDatabase
StuffIntoCache
return CachedObject as User
如何在ASP.NET MVC中实现简单缓存?
发布于 2018-12-05 10:10:46
您仍然可以使用缓存(在所有响应中共享)和会话(每个用户唯一)进行存储。
我喜欢以下“尝试从缓存/创建和存储”模式(c#-like伪代码):
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(ugh)或任何其他缓存机制。您还可以扩展ControllerContext.HttpContext(我认为它是System.Web.Extensions中的包装器之一),或者创建一个新类来实现它,以便模拟缓存。
发布于 2018-12-05 11:02:10
如果您希望将其缓存为请求的长度,请将其放在控制器基类中:
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对象进行更长时间的缓存,则需要使用唯一的缓存密钥,因为它将在请求/用户之间共享。
https://stackoverflow.com/questions/-100000907
复制相似问题