Mi aplicación incluye una serie de conjuntos de servicios de fondo (incluida una capa de repositorio de datos de Entity Framework) que son compartidos por una serie de ensamblajes frontales (incluido un servicio de Windows y una aplicación web MVC3).Dónde ubicar los módulos Ninject en una aplicación de varios niveles
Mi comprensión del proceso de enlace de Ninject es que cada conjunto que contiene tipos inyectables también debe contener un módulo Ninject que defina los enlaces predeterminados para estos tipos. El conjunto de módulos definidos se cargaría en el Kernel de Ninject de los ensamblados consumidores.
Sin embargo, estoy teniendo problemas, ya que el ámbito de enlace obligatorio no siempre es coherente. Por ejemplo, mi proyecto MVC debe vincularse al contexto de datos InRequestScope
, mientras que el servicio de Windows se une a la misma clase InThreadScope
.
Obviamente, puedo resolver este problema reubicando todos los módulos en los proyectos frontales y mantener copias separadas de cada módulo para cada escenario de uso, pero esto parece raro, ya que duplica gran parte del contenido del módulo en múltiples proyectos .
¿Existe una mejor práctica acerca de dónde deben ubicarse los módulos en una aplicación de varios niveles y cómo puedo conciliar esto con mi necesidad de diferencias vinculantes entre proyectos?
Muchas gracias por sus sugerencias,
Tim
ver también http://stackoverflow.com/questions/1699197/how-do-you-organise-your-ninject-modules (IIRC esta Q es una dup, pero esta es la mejor que tengo por ahora) –
Gracias, Rubén. Tienes razón en que hay mucho en común entre estas dos preguntas. Me gusta especialmente su sugerencia de pasar parámetros de tiempo de ejecución a módulos que residen en ensamblajes compatibles, muy flexible. –
Hmm; eso es hace un tiempo (no estaba intentando adular mi respuesta de ninguna manera). Es posible que haya significado literalmente * pasar parámetros * en el día - en general trataría de hacerlo a través de interfaces tanto como sea posible. Además, eso fue antes de http://manning.com/seemann, lo que reduce la cantidad de preguntas que encontrará intrigante en la arquitectura DI: def run comprátelas sin hacer preguntas. –