6

Soy nuevo en el COI en general y estoy luchando un poco para entender si lo que intento hacer tiene sentido. Tengo una aplicación de formularios web en la que quiero crear un módulo para definir algunos enlaces para mí. Las consolidaciones se usarán para inyectar repositorios en mis clases de gerente de negocios, lo que me permite probar las unidades de los gerentes de negocios. También me gustaría usar el contenedor para inyectar el contexto de Entity Framework en mis repositorios de esa manera todos comparten el mismo contexto por solicitud http. Así que aquí es lo que estoy preguntando:Dónde almacenar Ninject IKernel en una aplicación web?

  1. entiendo que tengo que tener la misma instancia del núcleo manejar mi creación de objetos y de su vida. Por ejemplo, si deseo un escenario de tipo de uno por cada httprequest, necesito que la instancia del kernel esté disponible para ese período de tiempo. ¿Qué pasa si necesito un singleton? Entonces tiene que ser un ámbito de aplicación de alguna manera. Entonces, ¿dónde exactamente guardo la instancia de IKernel? Parece que podría querer convertirlo en estático en mi Global.asax, ¿es ese el enfoque correcto y la seguridad de las hebras es una preocupación?

  2. Dado que estoy usando Bind <> para definir mis enlaces, ¿cómo hago para hacer esa definición en la capa Web/UI cuando no debería hacer referencia a mi capa de acceso a datos desde la UI? Mis referencias se parecen a .Web -> .Business -> DataAccess. Parece que quiero decirle al kernel "hey gestionar mis instancias de acceso a datos, pero no tienen una referencia en tiempo de compilación". Una unión de este tipo:

 

    //Any object requesting an instance of AdventureWorksEntities will get an instance per request 
    Bind<AdventureWorksEntities>().ToSelf().InRequestScope(); 
 

Siento que podría estar acercándose a este mal, gracias.

+0

http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor –

Respuesta

1

Re parte 1- eche un vistazo a la extensión Ninject.Web - mantiene un núcleo en el nivel de aplicación. A continuación, puede administrar otros recursos que tienen vidas más cortas dentro de eso también.

También, echar un vistazo por aquí para preguntas y ejemplos sobre la gestión de EF y L2S DataContext WRT Ninject y DI en general (que ha llegado [en las últimas semanas)

ACTUALIZACIÓN: This answer to another question from the same OP is far more concrete (Hay una clase KernelContainer con un .Inject(object) y un .Kernel)

+0

Ruben Miré en el Ninject.Web y parece que es lo que he estado buscando. Supongo que esta extensión se aprovecha de una referencia de kernel estático "global" subyacente, lo que en esencia es lograr lo que yo mismo estaba haciendo al convertirlo en una propiedad estática de Global.asax. Sin embargo, yendo por el camino de Ninject.Web no necesito preocuparme por la seguridad de los hilos ya que estoy seguro de que se han encargado de esto. – e36M3

+0

@ e36M3 Cool handle/vehicle (Soy un BH5 Blitzen: D). Lo tiene, menos la inferencia 'estática', es uno por aplicación Http (puede haber> 1 por proceso y/o dominio de aplicación), que puede ser ligeramente diferente.Asegúrese de echar un vistazo a esos otros artículos: debe realizar su trabajo de DB en el punto adecuado del flujo de procesamiento y no esperar que Ninject lo haga en el momento adecuado mediante IDisposable, etc. - Ninject sí lo hace, pero no sincroniza después de un tiempo, no necesariamente durante el procesamiento de la solicitud. –

+0

Gracias Ruben, voy a hacer un poco más de excavación. Sé que tiene que haber una manera de que comprometa el contexto de Entity Framework al final de la solicitud automáticamente (algo así como NHibernate), haré un escaneo de las publicaciones anteriores para ver si puedo encontrar algo así. Por ahora tengo el último gerente de negocios en la "transacción" responsable de llamar al método SaveChanges. Gracias de nuevo. – e36M3

1

Realmente depende de la complejidad de su aplicación web.

Parece que tiene una empresa y una capa de acceso a datos; Yo personalmente tendría una capa de 'infraestructura' donde almacenaría mi repositorio DI y las clases de ayuda.

+0

Gracias John, creo que su sugerencia es realmente el único camino a seguir para evitar ese acoplamiento entre las capas. No he utilizado ningún otro contenedor, pero hubiera pensado que si la configuración estuviera basada en XML, esto podría haberse evitado, lo que significa que el contenedor resolvería los archivos DLL en tiempo de ejecución. – e36M3

Cuestiones relacionadas