ASP.NET ページの 1 つのトレースを読んでいて、ユーザーが必要になるたびにページ ユーザーがデータベースから読み込まれていることに気付きました。それぞれISession
がオブジェクトをキャッシュすることになっているので、私はこれについて本当に当惑しています。
論理的には、問題は次の 2 つのいずれかである必要があります。
- の
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
これは私のために行うはずです。
何がうまくいかないのか、誰でも推測できますか?