2009-02-11 12 views
6

He estado usando Ninject como mi IOC en mi aplicación web. Es genial y creo que funciona muy bien, sin embargo, he estado tratando de registrar algunas interfaces/clases como OnePerRequestBehaviour, pero no parece que realmente use el comportamiento. El código se ejecuta correctamente, pero en una de mis clases carga información de la página de la base de datos una vez que se ha cargado, no necesita golpear la base de datos.Ninject OnePerRequestBehaviour parece que no funciona correctamente?

Mi problema es que la propiedad con la carga lenta se cargará en mi primera solicitud, cuando solicite la siguiente página se utiliza la misma instancia de la clase. La razón por la que sé esto es porque la clase no se vuelve a instanciar y la propiedad cargada de forma lenta ya está configurada.

Este código está dentro de mi clase de módulo:

public class NinjectModule : StandardModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWorkDataStore>().To<HttpContextDataStore>().Using<OnePerRequestBehavior>(); 


     Bind<CmsService>().ToSelf().Using<OnePerRequestBehavior>(); 
     Bind<CmsRepository>().ToSelf().Using<OnePerRequestBehavior>(); 
    } 
} 

A continuación, dentro de mi Global.asax que hereda de NinjectHttpApplication Tengo el siguiente:

 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; 
     } 

La primera llamada realizada a CmsService está dentro del global.asax también en 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 
      } 
     } 

T que por encima de GetCurrentPage() Código:

public ContentPage GetCurrentPage() 
{ 
    if (_currentPage != null) 
     return _currentPage; 

    return GetCurrentPage(_isAdmin); 
} 

Así como se puede ver la variable _currentPage sólo se carga si no se ha establecido antes, lo que debería ser una vez por solicitud, sin embargo no parece estar creando Ninject el CmsService por solicitud parece crearlo por un período de tiempo adicional.

Deos alguien tiene alguna idea de por qué esto no funciona para mí o cualquier código de ejemplo de donde definitivamente funciona?

Gracias

Respuesta

8

El OnePerRequestModule es un HttpModule, y necesita ser cargado en la canalización de ASP.NET con el fin de trabajar. Si se agrega a su web.config, que debería funcionar:

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> 

El comportamiento OnePerRequest se mejora en gran medida en Ninject2 (que está por venir liberado).

+1

¡Enhorabuena, pero supongo que la respuesta no sería incorrecta para el creador! Ninject es realmente bueno, me encanta. ¿Alguna idea cuando esperas que Ninject2 sea lanzado? –

Cuestiones relacionadas