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

C# 是否存储可在服务器请求中访问的对象?,c#,asp.net-mvc,httpcontext,asp.net-mvc-5.2,C#,Asp.net Mvc,Httpcontext,Asp.net Mvc 5.2,我正在开发一个ASP.NET MVC项目,我想延迟加载一个数据库DataContext对象,该对象在服务器请求中跨类使用(也就是说,它只通过一个请求活动,对于每个请求,我都有一个唯一的对象) 目前,我可以使用HttpContext.Current或HttpContext.Current.Request获取请求,但请求仅存储字符串值 是否有类似于会话对象的东西,但仅用于请求?类似于ViewBag或ViewData,但可从HttpContext对象访问 编辑:以下是我试图实现的目标:我有一个Acco

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

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

是否有类似于
会话
对象的东西,但仅用于请求?类似于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;
        }
    }
    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;
        }
    }
但是,正如我前面所说的,这个属性可能在一个请求中被实例化多次,它将为同一个UserProfile对象多次访问数据库。这只是一个示例,我有更多类似于此的对象,并希望进行更改,使其只访问数据库一次,然后将其保存以用于当前请求,如下所示:

    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;
        }
    }
    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;
        }
    }
我的解决方案有什么不好的地方吗


注意:我刚刚发现
routeValue
DataTokens
可能包含一对
密钥对象
,但我想知道是否可以使用它?

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

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

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

那一点让我很烦恼。也许它只是措词笨拙,但听起来好像您试图在请求之间持久化您的上下文,这将是一个非常糟糕的主意

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

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

那一点让我很烦恼。也许它只是措词笨拙,但听起来好像您试图在请求之间持久化您的上下文,这将是一个非常糟糕的主意

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

使用和。大多数IOC工具,如Castle Windsor,都允许在请求的生命周期内保持上下文

如果您不熟悉DI,下面是一个简单的示例:

Mycontroller
{
   IMyContext _contex;
   public Mycontroller(IMyContext context)
   {
      _context = context;
   }
}
使用和。大多数IOC工具,如Castle Windsor,都允许在请求的生命周期内保持上下文

如果您不熟悉DI,下面是一个简单的示例:

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

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

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

对于
缓存
Cookie
,必须手动擦除这些值,这是不好的。此外,
Cookie
只能存储
string
值。@DatVM和内存只存储字节-您关于字符串的观点?对于
Cache
Cookie
,您必须手动擦除值,这是不好的。此外,
Cookie
只能存储
string
值。@DatVM和内存只存储字节-您关于string的观点?对不起,可能我的话不正确,给您带来了麻烦。我的意思是,我想通过控制器、模型等访问它。。。在一个请求内。我知道重用
DataContext
对象是不好的。此外,除了DataContext之外,我还想存储一个登录的用户对象。我希望您现在理解我的解释。首先,请求对象仍然是错误的位置,因为它需要在像您的模型这样的位置依赖请求对象,这是完全不合适的。其次,不管怎样,您的模型都不应该依赖于上下文。第三,用户对象已经在请求中,所以我不确定您还需要什么。也许,如果你能提供更多的背景资料,说明你到底想实现什么以及为什么,我们可以给你更好的指导,告诉你如何继续。“为什么”尤其重要。你想解决什么问题?谢谢你的评论。我已经更新了问题,请看一下。对不起,也许我的话不正确,麻烦你了。我的意思是,我想通过控制器、模型等访问它。。。在一个请求内。我知道重用
DataContext
对象是不好的。此外,除了DataContext之外,我还想存储一个登录的用户对象。我希望您现在理解我的解释。首先,请求对象仍然是错误的位置,因为它需要在像您的模型这样的位置依赖请求对象,这是完全不合适的。其次,不管怎样,您的模型都不应该依赖于上下文。第三,用户对象已经在请求中,所以我不确定您还需要什么。也许,如果你能提供更多的背景资料,说明你到底想实现什么以及为什么,我们可以给你更好的指导,告诉你如何继续。“为什么”尤其重要。你想解决什么问题?谢谢你的评论。我已经更新了问题,请看一下。谢谢,这才是我真正需要的!谢谢,这实际上是wha