【发布时间】:2011-01-07 15:08:22
【问题描述】:
我刚刚阅读了我的一个 ASP.NET 页面的跟踪信息,我注意到每次需要用户时都会从数据库中加载页面用户。由于每个ISession 都应该缓存对象,我对此感到非常困惑。
从逻辑上讲,问题肯定是以下两件事之一:
-
ISession的缓存无法正常工作 - 每次请求用户时,都会使用不同的
ISession加载它
我认为问题是 2)。我正在使用 Castle Windsor 来管理对象生命周期,因此我发布了一些我正在使用的代码,以防有人可以帮助发现问题。 Castle Windsor 管理的课程有:
-
MooseUserRepository- 用于管理 MooseUser 实例(即本例中的页面用户)的存储库类 -
KctcUnitOfWork- ISession 的包装器
MooseUserRepository 对 KctcUnitOfWork 有一个构造函数依赖,如下所示:
public MooseUserRepository(IUnitOfWork unitOfWork)
{
}
配置文件如下所示:
<component id="KctcUnitOfWork" service="Kctc.BusinessLayer.Kctc.IUnitOfWork,Kctc.BusinessLayer" type="Kctc.NHibernate.Kctc.UnitOfWork,Kctc.NHibernate" lifestyle="PerWebRequest"/>
<component id="MooseUserRepository" service="Kctc.BusinessLayer.Kctc.Repositories.IMooseUserRepository,Kctc.BusinessLayer" type="Kctc.NHibernate.Kctc.Repositories.MooseUserRepository,Kctc.NHibernate" lifestyle="PerWebRequest"/>
注意PerWebRequest 的生活方式。
Castle Windsor 容器只是一种名为Moose.Application 的实用程序类的静态属性,因此它始终存在:
private static IWindsorContainer _windsorContainer;
public static IWindsorContainer WindsorContainer
{
get
{
if (_windsorContainer == null)
{
_windsorContainer = new WindsorContainer(new XmlInterpreter(HttpContext.Current.Server.MapPath("~/CastleWindsorConfiguration.xml")));
}
return _windsorContainer;
}
}
页面本身有一个 IMooseUserRepository 实例,如下所示:
private IMooseUserRepository _mooseUserRepository;
private IMooseUserRepository MooseUserRepository
{
get
{
if (_mooseUserRepository == null)
{
_mooseUserRepository = Moose.Application.WindsorContainer.Resolve<IMooseUserRepository>();
}
return _mooseUserRepository;
}
}
页面的用户通过如下所示的属性访问:
private MooseUser PageUser
{
get { return MooseUserRepository.Load(ApplicationSettings.UsernameFromWeb); }}
似乎这些对PageUser 的后续调用导致了重复的 SQL 命令:
txtSubject.Enabled = PageUser.CanHandleLegalWorks;
ddlDue.Enabled = PageUser.CanHandleLegalWorks;
现在显然我可以通过将加载的 MooseUser 对象存储在私有变量中来解决这个问题,但我的理解是 ISession 应该为我做这件事。
任何人都可以冒险猜测发生了什么问题吗?
【问题讨论】:
-
你是否有任何改变从不同的实体继承你的类?发布您的映射和实体类。
-
根据您的应用程序中的并发性,您是否应该接听有关缓存的电话。
-
启动 NhProf 并查看您是否为每个请求创建了多个会话 - 它有 30 天的免费试用期。
-
大卫,你能贴出 Kctc.NHibernate.Kctc.UnitOfWork 的样子吗?
标签: nhibernate castle-windsor isession first-level-cache