6

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 を作成していないようです。時間。

なぜこれが私にとって機能しないのか、またはそれが確実に機能する場所のサンプルコードを知っている人はいますか?

ありがとう

4

1 に答える 1

9

OnePerRequestModule は HttpModule であり、動作させるには ASP.NET パイプラインにロードする必要があります。これを web.config に追加すると、動作するはずです。

IIS7:

<system.webServer> 
  <modules>
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/>
  </modules>
</system.webServer>

IIS6:

<system.web>
  <httpModules>
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/>
  </httpModules>
</system.web>

OnePerRequest の動作は、Ninject2 (まだリリースされていません) で大幅に改善されています。

于 2009-02-11T14:41:01.180 に答える