6

我一直在我的网络应用程序中使用 Ninject 作为我的 IOC。这很棒,我认为它工作得很好,但是我一直在尝试将一些接口/类注册为 OnePerRequestBehaviour,但它似乎并没有真正使用这种行为。代码运行正确,但在我的一个类中,它延迟从数据库加载页面信息,然后一旦加载它就不需要访问数据库。

我的问题是延迟加载的属性将在我的第一个请求中加载,然后当我请求下一页时使用该类的相同实例。我知道这是因为该类没有再次实例化并且已经设置了延迟加载的属性。

此代码在我的模块类中:

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 变量仅在之前未设置的情况下才被加载,这应该是每个请求一次,但是 Ninject 似乎并没有为每个请求创建 CmsService 它似乎是为任意数量的时间。

Deos 任何人都知道为什么这对我不起作用或它肯定起作用的任何示例代码?

谢谢

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 回答