Я только что читал трассировку одной из моих страниц 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
должен делать это за меня.
Может ли кто-нибудь рискнуть предположить, что происходит не так?