我使用基本控制器和 OnActionExecuting 来获取我想要显示并保留在大多数页面(名称、ID 等......不超过 4/5 字段)的“通用”站点数据
OnActionExecuting 中的方法读取数据库并保存到 ViewBag 中,我在我的视图中选择了它,但我不禁认为这是一种浪费,因为它需要为每个 OnActionExecuting 调用数据库。
如何整合这些数据库调用并减少数据库访问?
我使用基本控制器和 OnActionExecuting 来获取我想要显示并保留在大多数页面(名称、ID 等......不超过 4/5 字段)的“通用”站点数据
OnActionExecuting 中的方法读取数据库并保存到 ViewBag 中,我在我的视图中选择了它,但我不禁认为这是一种浪费,因为它需要为每个 OnActionExecuting 调用数据库。
如何整合这些数据库调用并减少数据库访问?
缓存存储库层中的公共数据值。
我在最近的一个项目中所做的是在登录期间我得到了“通用”数据,在这种情况下是 UserID、FirstName 和 ImageName,我将它保存在 Auth Ticket 中,如下所示:
UserData = pModel.PartyId.ToString() + "|" + pModel.BusinessName + "|" + pModel.FirstName + "|" + pModel.LastName + "|" + pModel.ImageUrl + "|" + UsersRole + "|" + IsAct;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct
// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UN, true);
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, UserData);
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
然后,我在需要数据时检索此 Cookie,并像这样从中获取数据:
var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
dynamic UN = FormsAuthentication.Decrypt(cookie.Value);
string UserData = UN.UserData;//PID, BusName, FirstName, LastName, imgUrl, Role, IsAct
string[] pFields = UserData.Split('|');
string[] MyRoles = { pFields[5] };
请注意:这仅适用于您知道在登录会话期间不会更改的静态数据,请注意您在此 Cookie 中发布的内容。
不要让 cookie 膨胀,或者将字段保持在最小值,最大值为 4K,但我的目标是 500-1000 字节。
从基本控制器继承并不意味着您在请求之间共享状态。每个请求都会产生一个新的控制器实例。
如果您不想每次都检索这些数据,则需要以某种状态(缓存、会话、应用程序)存储这些数据。然后,您可以从基本控制器访问存储它的任何机制。
然后是免责声明……这些访问数据库的费用是否昂贵?你打算用最小的延迟问题来换取内存管理问题吗?
更新:
如果它只是 4-5 个字段(这似乎是用户特定的,并且在用户会话期间它们不会更改),那么我只需将它们存储在会话状态中。
个人偏好在这里,但我喜欢在基本控制器/页面中使用强类型访问器,例如:
protected string Name
{
get
{
if (Session["Name"] == null)
{
var results = GoLoadFields();
return Session["Name"].ToString();
}
return Session["Name"].ToString();
}
set
{
Session["Name"] = value;
}
}
然后在从基本控制器继承的所有控制器中,都可以引用这些属性:
myAwesomeViewModel.Name = this.Name;
内存管理免责声明旨在让您避免查询数据库,获得相同的大型结果集,并将其推送到每个用户的会话中。在你把任何东西放在内存中之前,只要确保你只保留你需要的东西以及你需要它多长时间。
您可以 为此目的使用System.Runtime.Caching.MemoryCache 。
一些例子:
缓存将在请求中持续存在,直到达到每个缓存项的到期时间。