2011-02-16 18 views
12

He probado recientemente Ninject con la extensión , y he notado algo peculiar y, sin romper, confuso.Ninject y OnePerRequestModule

En la clase abstracta NinjectHttpApplication, no es un constructor definido de la siguiente manera ..

/// <summary> 
    /// Initializes a new instance of the <see cref="NinjectHttpApplication"/> class. 
    /// </summary> 
    protected NinjectHttpApplication() 
    { 
     this.onePerRequestModule = new OnePerRequestModule(); 
     this.onePerRequestModule.Init(this); 
    } 

He colocado un punto de interrupción depurador aquí, y esto es llamado un par de veces. No puedo encontrar ninguna documentación real sobre eso. En el código de implementación, hay esta línea que me llama la atención.

  if (kernel.Settings.Get("ReleaseScopeAtRequestEnd", true)) 
      { 
       OnePerRequestModule.StartManaging(kernel); 
      } 

Mis preguntas son las siguientes ...

  • ¿Cuál es OnePerRequestModule
  • ¿Por qué es este constructor ser llamado varias veces?
  • ¿Cuál es el propósito de este método StartManaging, si se llama al constructor varias veces?
+0

relacionado: http://stackoverflow.com/questions/15778324/do-i-need-to-register-ninject-oneperrequestmodule-with-ninject-web-mvc-3-0/15786866# –

Respuesta

13

El OnePerRequestModule elimina InRequestScope() d objetos del kernel de Cache al término de cada solicitud HTTP.

El ctor NinjectHttpApplication se denomina varias veces porque IIS crea varias de ellas. Un NinjectHttpApplication solo puede gestionar una solicitud a la vez. Así que IIS genera (al menos) una instancia por hilo.

StartManaging dice a todos OnePerRequestModules que liberarán los objetos InRequestScoped del núcleo especificado después de que la solicitud haya finalizado.

+0

Esto es algo Estoy bien para dejar intacto? No es algo de lo que deba preocuparme? – Ciel

+0

@Ciel Doc debería estar muy claro ahora, vea http://stackoverflow.com/a/15786866/11635 y https://github.com/ninject/Ninject.Web.Common/wiki/InRequestScope –