我正在开发一个ASP.NET MVC项目,我想延迟加载在服务器请求中跨Class
es使用的数据库DataContext对象(也就是说,它只通过Request,对于每个请求,我都有一个独特的对象。)
目前我可以使用HttpContext.Current
或HttpContext.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:我发现RouteValues
和DataTokens
可能包含key-object
对,但我想知道是否可以使用它?
答案 0 :(得分:2)
使用HttpContext.Items集合在请求的生命周期内共享对象。
答案 1 :(得分:1)
我想延迟加载仅在请求中使用的数据库DataContext对象。
这有点麻烦我。也许它只是措辞笨拙,但听起来好像你试图在请求中坚持你的上下文,这将是非常坏主意。
但是,如果您只是在谈论持久查询或类似的结果,我建议使用ASP.NET提供的内存中缓存。使用会话或cookie涉及依赖客户存储信息,这对于此类事情既不必要也不合适。
答案 2 :(得分:0)
您可以使用HttpContext访问Cache和Cookie,使用后可以清空它们。
答案 3 :(得分:0)
使用dependency injection和Inversion of Control。大多数IOC工具,如Castle Windsor,将允许您在请求的生命周期中保持上下文。
如果你不熟悉DI,这是一个简单的例子:
Mycontroller
{
IMyContext _contex;
public Mycontroller(IMyContext context)
{
_context = context;
}
}