2009-11-09 14 views
12

La arquitectura de los módulos de NInject parece útil, pero me preocupa que se convierta en un desastre.¿Cómo se organizan los módulos de NInject?

¿Cómo se organizan los módulos? ¿En qué ensamble los guardas y cómo decides qué cableados van en qué módulo?

+0

Buena pregunta. Me gustaría ver más discusión de esto mientras comparto sus preocupaciones. Tener un módulo por subsistema parece razonable, pero también tengo módulos para cablear las dependencias de forma diferente para las pruebas unitarias. – JulianM

Respuesta

7

Cada subsistema obtiene un módulo. Por supuesto, la definición de lo que garantiza la categorización como un 'subsistema' depende ...

En algunos casos, la responsabilidad de algunos enlaces se eleva a un nivel superior ya que un subsistema/componente de nivel inferior no está en condiciones de tomar una decisión final con autoridad: en algunos casos, esto se puede lograr pasando parámetros al Módulo.

2

Respondiendo a mi propia publicación después de un par de años de usar NInject.

Así es como puedo organizar mis NInjectModules, usando una librería como un ejemplo:

  • BookStoreSolution
    • Domain.csproj
    • Services.csproj
      • CustomerServicesInjectionModule.cs
      • PaymentProcessingInjectionModule.cs
    • DataAccess.csproj
      • CustomerDatabaseInjectionModule.cs
      • BookDatabaseInjectionModule.cs
    • CustomSecurityFramework.csproj
      • CustomSecurityFrameworkInjectionModule.cs
    • PublicWebsite.csproj
      • PublicWebsiteInjectionModule.cs
    • Intranet.csproj
      • IntranetInjectionModule.cs

Lo que esto quiere decir es que cada proyecto en el sistema viene preenvasado con uno o más NInject módulos que saben cómo configurar los enlaces para las clases de ese proyecto.

La mayoría de las veces una aplicación individual no va a querer hacer cambios significativos en los módulos de inyección predeterminados proporcionados por un proyecto. Por ejemplo, si estoy creando una pequeña aplicación de WinForm que necesita importar el proyecto de DataAccess, normalmente también querré tener todas las clases de Repository <> del proyecto vinculadas a sus interfaces IRepository <> asociadas.

Al mismo tiempo, no hay nada que obligue a una aplicación individual a usar un módulo de inyección en particular.Una aplicación puede crear su propio módulo de inyección e ignorar los módulos predeterminados proporcionados por un proyecto que está importando. De esta forma, el sistema sigue siendo flexible y desacoplado.

+0

Entonces ... ¿esto significa que debe incluir un paquete/referencia Ninject en cada uno de los proyectos que tienen un módulo? Preferiría tener un solo lugar en el conjunto de mi llamada (por ejemplo, el proyecto web) donde registro cada servicio que necesito, y luego solo ese ensamblaje tomará una referencia directa a Ninject. ¿Pensamientos? –

+0

Sí, eso es una desventaja con esta configuración. Sin embargo, a menos que tenga una aplicación muy pura que nunca use la inyección de propiedades o use Kernel. Obtenga <>(), entonces generalmente termino con una referencia de NInject. – cbp

+0

bueno ... acabo de terminar un proyecto que usó Unity para DI, y terminé con un método largo de RegisterServices en mi bootstrapper dentro del proyecto web. Ninguno mis proyectos de libs de clase tenían una dependencia directa en Unity o EntLib directamente. Todos ellos aprovecharon la inyección de constructor. Pensé que era bastante agradable. –

Cuestiones relacionadas