两个动作方法相同的控制器,我正在使用模型弹出窗口显示详细信息。
我的问题 我不想使用实体框架。 - 当admin表单加载时,我将获得所有用户详细信息,这是索引操作方法 - 基于用户ID,我需要显示特定用户,所以我不想要打到数据库已经我有所有用户的详细信息。详细说明如何获得另一种行动方法?
我记得asp.net我使用session来全局共享数据。像那样的asp.net mvc可能吗?请帮帮我。
由于
答案 0 :(得分:3)
看起来你正在寻找缓存机制。对于简单的场景,我使用一个简单的静态变量,但我将它保存在一个单独的类中。假设你有一个像这样的User类:
public class User
{
public string Id { get; set; }
public string Name { get; set; }
}
你可以创建一个这样的类:
public static class UserCacheService
{
private static IEnumerable<User> _users;
private static readonly object lockObj = new object();
public static IEnumerable<User> GetUsers()
{
lock (lockObj)
{
if (_users == null)
{
using (var db = new MyNiceDbContext())
{
_users = db.Users.ToList();
}
}
return _users;
}
}
public static void InvalidateCache()
{
lock (lockObj)
{
_users = null;
}
}
}
然后,您可以在任何操作中获取共享用户,例如:
public class AdminController : Controller
{
public ActionResult Index()
{
// the first time, it'll need to get users from DB (e.g with Entity Framework)
var users = UserCacheService.GetUsers();
return View();
}
}
第一次,_users
中的UserCacheService
将为null,正如预期的那样,它需要从数据库加载用户。但是,无论您是否使用其他控制器,下一次都不会:
public class AnotherController : Controller
{
public ActionResult Index(string userId)
{
// now, it won't load from DB anymore, because _users is already populated...
var users = UserCacheService.GetUsers();
var currentUser = users.Where(u => u.Id == userId).FirstOrDefault();
if (currentUser != null)
{
// do something with the user...
}
return View();
}
}
有时您的_users
会再次成为null
,例如当您在IIS中重新启动 ApplicationPool 时,UserCacheService
已经准备好了如果是这种情况,则获取一次数据库。
小心三件事:
_users
),您就会消耗
您的服务器内存,可能会受到限制。不要开始尝试
将所有内容保存在内存中,只保存每次都知道的数据。_users
每次都无法从数据库获取,您需要调用UserCacheService.InvalidateCache()
方法,以便强制下一次调用再次从数据库加载,从而确保你有_users
最新。