我正在使用基本控制器& OnActionExecuting获取我要显示的“常见”网站数据&保持大多数页面(名称,ID等...不超过4/5字段)
OnActionExecuting中的方法读取数据库&保存到我的视图中提取的ViewBag,但我不能认为这是一种浪费,因为它需要每次OnActionExecuting的DB调用。
如何整合这些数据库调用并减少数据库访问?
答案 0 :(得分:1)
缓存存储库层中的公共数据值。
答案 1 :(得分:1)
我在最近的一个项目中所做的是在登录期间我得到'常见'数据,在这种情况下是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字节。
答案 2 :(得分:0)
从基本控制器继承并不意味着您在请求之间具有共享状态。每个请求都将生成一个新的控制器实例。
如果您不想每次都检索此数据,则需要将此数据存储在某种状态(缓存,会话,应用程序)中。然后,您可以使用基本控制器访问存储它的任何机制。
然后是免责声明......这些到数据库的旅行是否昂贵?您是否要针对内存管理问题交换最小延迟问题?
更新:
如果只有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;
内存管理免责声明旨在让您避免查询数据库,获取相同的大型结果集,并在每个用户的会话中推送它。在你记忆中的任何东西之前,只要确保你只保留你需要的东西以及你需要多长时间。
答案 3 :(得分:0)
您可以将System.Runtime.Caching.MemoryCache用于此目的。
一些例子:
缓存将在请求之间保持不变,直到达到每个缓存项目的到期时间。