我一直在使用Ninject作为我国际奥委会在我的web应用程序。这是伟大的,我认为它的作品真的很好,但我一直在尝试注册一些接口/类作为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>();
    }
}

然后内部我的Global.asax从NinjectHttpApplication继承我有以下:

        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 abritrary量的时间。

DEOS人有,为什么这不是为我工作或在那里肯定没有任何工作示例代码的任何想法?

由于

有帮助吗?

解决方案

在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(这是尚未公布)大大提高。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top