0

我使用基本控制器和 OnActionExecuting 来获取我想要显示并保留在大多数页面(名称、ID 等......不超过 4/5 字段)的“通用”站点数据

OnActionExecuting 中的方法读取数据库并保存到 ViewBag 中,我在我的视图中选择了它,但我不禁认为这是一种浪费,因为它需要为每个 OnActionExecuting 调用数据库。

如何整合这些数据库调用并减少数据库访问?

4

4 回答 4

1

缓存存储库层中的公共数据值。

于 2012-04-13T17:31:58.917 回答
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 字节。

于 2012-04-13T17:38:49.070 回答
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;

内存管理免责声明旨在让您避免查询数据库,获得相同的大型结果集,并将其推送到每个用户的会话中。在你把任何东西放在内存中之前,只要确保你只保留你需要的东西以及你需要它多长时间。

于 2012-04-13T17:38:48.367 回答
0

您可以 为此目的使用System.Runtime.Caching.MemoryCache 。

一些例子:

缓存将在请求中持续存在,直到达到每个缓存项的到期时间。

于 2012-04-13T18:03:10.803 回答