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

Store an object that is accessible within a Server Request?

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

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

是否有类似 Session 对象的东西,但仅用于请求?类似于 ViewBag 或 ViewData,但可从 HttpContext 对象访问?

编辑:这是我想要实现的目标:我有一个 AccountBusiness class,可能会在请求中多次实例化。它具有延迟加载的 LoggedInUser 属性(注意:这不是 ASP.NET Identity 的 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,但我想知道是否可以使用它?

您可以使用缓存或 Cookie,两者都可以通过 HttpContext 访问,使用后您可以清空它们。

I would like to lazy-load a database DataContext object that is used across the Request only.

这让我很烦恼。也许它只是措辞笨拙,但听起来好像您正试图以某种方式在请求中保留您的上下文,这将是一个非常的坏主意。

但是,如果您只是在谈论保留查询或类似结果,我建议使用 ASP.NET 提供的内存缓存。使用 session 或 cookie 涉及到依赖客户端来存储信息,对于这种事情来说既不必要也不合适。

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

如果您不熟悉 DI,这里有一个简单的例子:

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

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