存储在服务器请求中可访问的对象?
Store an object that is accessible within a Server Request?
我正在开发一个 ASP.NET MVC 项目,我想在服务器请求中延迟加载跨 Class
es 使用的数据库 DataContext 对象(也就是说,它只存在通过请求,对于每个请求,我都有一个唯一的对象)。
目前我可以使用HttpContext.Current
或HttpContext.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:我刚刚发现RouteValues
和DataTokens
可能包含一对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 集合共享对象。
我正在开发一个 ASP.NET MVC 项目,我想在服务器请求中延迟加载跨 Class
es 使用的数据库 DataContext 对象(也就是说,它只存在通过请求,对于每个请求,我都有一个唯一的对象)。
目前我可以使用HttpContext.Current
或HttpContext.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:我刚刚发现RouteValues
和DataTokens
可能包含一对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 集合共享对象。