Web アプリの IOC として Ninject を使用しています。それは素晴らしく、うまく機能すると思いますが、いくつかのインターフェイス/クラスを OnePerRequestBehaviour として登録しようとしましたが、実際には動作を使用していないようです。コードは正しく実行されますが、私のクラスの 1 つで、データベースからページ情報を遅延読み込みし、読み込まれた後はデータベースにアクセスする必要はありません。
私の問題は、遅延ロードされたプロパティが最初のリクエストでロードされ、次のページをリクエストすると、クラスの同じインスタンスが使用されることです。私がこれを知っている理由は、クラスが再度インスタンス化されておらず、遅延ロードされたプロパティが既に設定されているためです。
このコードは私のモジュールクラス内にあります:
public class NinjectModule : StandardModule
{
public override void Load()
{
Bind<IUnitOfWorkDataStore>().To<HttpContextDataStore>().Using<OnePerRequestBehavior>();
Bind<CmsService>().ToSelf().Using<OnePerRequestBehavior>();
Bind<CmsRepository>().ToSelf().Using<OnePerRequestBehavior>();
}
}
次に、NinjectHttpApplication から継承する Global.asax 内に次のものがあります。
protected override IKernel CreateKernel()
{
OnePerRequestModule module = new OnePerRequestModule();
module.Init(this);
KernelOptions options = new KernelOptions();
options.InjectNonPublicMembers = true;
IKernel kernel = new StandardKernel(options, new NinjectModule());
return kernel;
}
CmsService への最初の呼び出しは、global.asax 内と、authenticate_request で行われます。
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx") &&
!HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx/"))
{
CmsService facCMS = HttpKernelFactory.Get<CmsService>();
ContentPage page = facCMS.GetCurrentPage();
// DO Logic based on the page being brought back
}
}
上記の GetCurrentPage() コード:
public ContentPage GetCurrentPage()
{
if (_currentPage != null)
return _currentPage;
return GetCurrentPage(_isAdmin);
}
ご覧のとおり、_currentPage 変数は、以前に設定されていない場合にのみロードされます。これはリクエストごとに 1 回行う必要がありますが、Ninject はリクエストごとに CmsService を作成していないようです。時間。
なぜこれが私にとって機能しないのか、またはそれが確実に機能する場所のサンプルコードを知っている人はいますか?
ありがとう