Я только что прочитал трассировку для одной из моих страниц ASP.NET и заметил, что пользователь страницы загружается из базы данных каждый раз, когда он требуется.Поскольку каждый ISession
должен кешировать объекты, я действительно озадачен этим.
Логически, проблема, безусловно, должна заключаться в одной из следующих двух вещей:
- The *Кэш 1007 * не работает должным образом
- Каждый раз, когда пользователь запрашивается, он загружается с использованием
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
должен делатьэто для меня.
Может ли кто-нибудь рискнуть догадаться о том, что идет не так?