C# 是否存储可在服务器请求中访问的对象?
我正在开发一个ASP.NET MVC项目,我想延迟加载一个数据库DataContext对象,该对象在服务器请求中跨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
类使用(也就是说,它只通过一个请求活动,对于每个请求,我都有一个唯一的对象)
目前,我可以使用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