Я только что прочитал трассировку для одной из моих страниц ASP.NET, и я заметил, что пользователь страницы загружается из базы данных каждый раз, когда пользователь требуется. Поскольку каждый ISession
должен кэшировать объекты, я действительно удивлен этим.NHibernate загружается один и тот же объект несколько раз - пожалуйста, помогите!
Логически, эта проблема должна, безусловно, будет одна из следующих двух вещей:
- Кэш
ISession
«s не работает должным образом - Каждый раз, когда пользователь запрашивается, он загружается с помощью другого
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
образе жизни.
Замок Виндзор контейнер просто статическое свойство своего рода служебный класс называется 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
должен сделать это для меня.
Может ли кто-нибудь рискнуть предположить, что происходит не так?
Есть ли у вас какие-либо изменения, наследующие ваш класс от другого объекта? Опубликуйте свой класс сопоставления и сущности. – jishi
В зависимости от параллелизма в вашем приложении вы должны позвонить о кешировании или нет. – Baz1nga
Запустите NhProf и проверьте, не создано ли несколько сеансов для каждого запроса - у него есть 30-дневная бесплатная пробная версия. – DanB