我刚刚阅读了我的一个 ASP.NET 页面的跟踪,我注意到每次需要用户时都会从数据库中加载页面用户。由于每个ISession
都应该缓存对象,因此我对此感到非常困惑。
从逻辑上讲,问题肯定是以下两件事之一:
- 的
ISession
缓存无法正常工作 - 每次请求用户时,都会使用不同的方式加载
ISession
我认为问题是2)。我正在使用 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
应该为我做这个。
任何人都可以冒险猜测出了什么问题吗?