2012-05-14 9 views
7

Recientemente, he actualizado uno de mis proyectos de MvC3 Ninject 2 a 3. NinjectNinject 3 InRequestScope no devolver la misma instancia de la misma petición

Después de un par de minutos tratando de encontrar qué InRequestScope ya no estaba disponible, Descubrí que ahora es una extensión de Ninject.Web.Common.

Ahora, cuando intento ejecutar la aplicación, Ninject funciona como si todos los tipos combinados con un alcance InRequest fueran InTransientScope; una nueva instancia fue creada cada vez.

En mi clase que hereda de NinjectModule, tengo un enlace simple como eso:

Bind<ViewModel.Activity>().ToSelf().InRequestScope(); 

En mi controlador, tengo 2 inmuebles de la ViewModel.Activity tipo marcado con el atributo de Ninject.

[Inject] 
    public ViewModel.Activity Activity { get; set; } 

    [Inject] 
    public ViewModel.Activity Activity1 { get; set; } 

Si miraba en modo de depuración del valor de la HashCode tanto de las dos propiedades, no todos tienen valor diferente pero HttpContext es la misma; Estoy en la misma solicitud.

¿Qué me perdí sobre cómo usar correctamente el nuevo Ninject.Web.Common.InRequestScope con la nueva versión de Ninject 3?

Muchas gracias.

+0

¿Cómo enlazas Ninject en tu código? ¿Estás usando Ninject.MVC3 desde nuget, y luego editando el archivo NinjectWebCommon.cs? o estás haciendo una fábrica de controlador personalizado? –

+0

Una fábrica personalizada – Samuel

+0

@MystereMan Muchas gracias. Esto es exactamente lo que quiero. Usé NuGet para encontrar Ninject MVC3 y simplemente agregué lo que dijiste en NinjectWebCommon para el enlace de mis dependencias y funciona. Creo que la clave de por qué este trabajo es debido a estas líneas: DynamicModuleUtility.RegisterModule (typeof (OnePerRequestHttpModule)); y DynamicModuleUtility.RegisterModule (typeof (NinjectHttpModule)); OnePerRequestHttpModule también eliminará toda mi unidad de trabajo inmediatamente después de cada solicitud. ¡Muchas gracias! – Samuel

Respuesta

9

añadido como una respuesta por lo que este puede ser cerrado a cabo

No utilice una fábrica personalizado. Simplemente instale Ninject.MVC3 y copie sus enlaces en el archivo NinjectWebCommon.cs, luego borre todo su código anterior.

+0

¿Qué es este comentario agregado al principio de la respuesta? – Samuel

+0

@Samuel: originalmente había publicado esto como un comentario, pero me pediste que lo publicara como respuesta para que pudiera marcarse como la respuesta. Así que lo hice, y de hecho lo marcó como la respuesta. Entonces, por alguna razón, de repente decidió desmarcarlo como respuesta. –

+0

Lo siento, mi error. – Samuel

7

Ninject.Web.Common no se puede usar de forma independiente. Debe usar alguna extensión web o wcf adicional o implementar InRequestScope usted mismo.

+0

Gracias Remo por su tiempo. ¿Tiene una muestra de código de cómo implementarlo? En mi módulo, utilizo la sintaxis bind para el tipo que deseo ser inyectado y con la ayuda de un uso de ninject.web.common, llamo al final de la instrucción bind el método InRequestScope. ¿No es suficiente decirle a ninject qué alcance quiero? – Samuel

+1

No, eso no es suficiente, porque InRequestScope puede significar InWCFRequestScope o InHttpRequestScope y, en el futuro, también otros ámbitos. Web.Common no sabe nada sobre los diversos tipos de solicitud. Recomiendo fuertemente usar una de las extensiones web. No hay razón para implementar fábricas propias y no doy ningún apoyo sobre ellas. Mire las extensiones y copie toda la lógica desde allí si realmente quiere usar su propia fábrica. –

+0

Hola Remo, gracias por ayudarme. Busqué en las extensiones y google 'InHttpRequestScope', pero no encontré ninguna información que me ayudara a implementar InHttpRequestScope. ¿En qué extensión podría encontrar este método, clase? – Samuel

Cuestiones relacionadas