存储可在服务器请求中访问的对象?

时间:2015-10-06 16:37:10

标签: c# asp.net-mvc httpcontext asp.net-mvc-5.2

我正在开发一个ASP.NET MVC项目,我想延迟加载在服务器请求中跨Class es使用的数据库DataContext对象(也就是说,它只通过Request,对于每个请求,我都有一个独特的对象。)

目前我可以使用HttpContext.CurrentHttpContext.Current.Request获取请求,但请求只存储字符串值。

是否有类似Session对象的内容,但仅针对请求?类似于ViewBag或ViewData,但可以从HttpContext对象访问?

编辑:这是我想要实现的:我有一个AccountBusiness类,可以在请求中多次实例化。它具有LoggedInUser属性(注意:这不是ASP.NET身份的AspNetUser对象),它是延迟加载的。通常我会做这样的事情:

    private UserProfile loggedInProfile;
    public UserProfile LoggedInProfile
    {
        get
        {
            if (this.loggedInProfile == null)
            {
                var userId = HttpContext.Current.User.Identity.GetUserId();
                this.loggedInProfile = this.Context.UserProfiles.FirstOrDefault(q => q.ID == userId);
            }

            return this.loggedInProfile;
        }
    }

但是,正如我之前所说,此属性可能会在请求中多次实例化,它将多次访问数据库以获取同一个UserProfile对象。这只是一个例子,我有更多与此类似的对象,并且想要更改以便它只访问数据库一次,然后保存它以用于当前请求,如下所示:

    public UserProfile LoggedInProfile
    {
        get
        {
            if (this.loggedInProfile == null)
            {
                var dataTokens = HttpContext.Current.Request.RequestContext.RouteData.DataTokens;
                object o;
                if (!dataTokens.TryGetValue("CurrentUserProfile", out o))
                {
                    var userId = HttpContext.Current.User.Identity.GetUserId();
                    dataTokens["CurrentUserProfile"] = o = this.Context.UserProfiles
                        .FirstOrDefault(q => q.ID == userId);
                }
                this.loggedInProfile = o as UserProfile;
            }

            return this.loggedInProfile;
        }
    }

我的解决方案有什么坏处吗?

P.s:我发现RouteValuesDataTokens可能包含key-object对,但我想知道是否可以使用它?

4 个答案:

答案 0 :(得分:2)

使用HttpContext.Items集合在请求的生命周期内共享对象。

答案 1 :(得分:1)

  

我想延迟加载仅在请求中使用的数据库DataContext对象。

这有点麻烦我。也许它只是措辞笨拙,但听起来好像你试图在请求中坚持你的上下文,这将是非常坏主意。

但是,如果您只是在谈论持久查询或类似的结果,我建议使用ASP.NET提供的内存中缓存。使用会话或cookie涉及依赖客户存储信息,这对于此类事情既不必要也不合适。

答案 2 :(得分:0)

您可以使用HttpContext访问Cache和Cookie,使用后可以清空它们。

答案 3 :(得分:0)

使用dependency injectionInversion of Control。大多数IOC工具,如Castle Windsor,将允许您在请求的生命周期中保持上下文。

如果你不熟悉DI,这是一个简单的例子:

Mycontroller
{
   IMyContext _contex;
   public Mycontroller(IMyContext context)
   {
      _context = context;
   }
}