2009-11-04 55 views
9

Estoy creando una pequeña aplicación C#, que actualmente consta de un conjunto de núcleo y un ensamblado de winforms. Me doy cuenta de que probablemente no necesite Ninject en algo tan pequeño como este, pero me gustaría probarlo.C#, Ninject: ¿Dónde colocas el kernel y tus módulos?

De todos modos, para trabajar con Ninject, he entendido que escribiría un conjunto de módulos, que mapea la clase se devuelve y así sucesivamente. Después de eso, crearía una instancia de IKernel y cargaría sus módulos en eso.

Pero, ¿dónde guardo esos módulos? ¿Y dónde guardo el kernel? ¿A dónde van las cosas?

Respuesta

3

Puede crear una clase de contenedor estático para kernel. De esta manera podría hacer algo como ServiceLocator.Resolve()

Para registrar servicios hay dos formas: en línea y en el registro del módulo. Ambos deben cargarse en bootstrapping. Módulo es mejor para organizar.

Quizás sería más fácil comenzar con StructureMap porque hay una clase estática y tiene funciones de asignación automática.

Esas grabaciones de pantalla deben tener que comenzar:

3

+ ha hecho +1 en la respuesta de Marek - definitivamente mirar a través de esos recursos.

Algunos puntos ...

definitivamente derecho a probar esto, incluso en una pequeña aplicación. También es importante pensar mucho sobre preguntas superficialmente simples como la que planteaste. Para DI, realmente tienes que trabajar un poco para realmente apreciarlo, yo por lo menos estuve en el campamento "Oh, tengo una aplicación pequeña" (denegación) durante mucho tiempo hasta que realmente lo usé .

Hay una escuela de que, en general, una debería estar alejándose del Localizador de Servicios y simplemente teniendo inyección [sin dependencias en un contenedor].

Si no utiliza los Localizadores de servicios, nadie necesita saber dónde está el Envase (Núcleo), que es lo mejor.

Los módulos tienen principalmente el propósito de compartimentar lotes de cosas para registrar en un Contenedor general particular (Kernel).

Seguramente hay una implementación de Singleton canónica 'Global Container' para Ninject? EDIT: Acabo de encontrar una: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

Véase también Ninject: How do I inject into a class library?

+0

Estaba buscando una manera canónica de hacer esto y pensé "¡genial!" cuando te vi vinculado. Malas noticias, ese código es TERRÍFERAMENTE UNIDERO. Si debo envolver el kernel en un singleton, puedo hacerlo yo mismo de una manera segura (pista, constructor estático), pero tengan cuidado con todos los que vienen aquí en el futuro: ese artículo de enlaces es una implementación completamente no segura para subprocesos. –

+0

@JimmyHoffa Estoy de acuerdo en que no es inseguro (sugiera aplicar un enfoque de su elección desde http://csharpindepth.com/articles/general/singleton.aspx). Sin embargo, mucho mejor que eso es ir con el punto principal de mi respuesta, que es tener una raíz de composición que tenga un lugar claro donde pueda tener lugar la inicialización para tomar la necesidad de que esta seguridad de subprocesos (entre otros) quede fuera de la imagen completamente. –

+0

No estoy familiarizado con tu raíz de composición, pero sin acceso al kernel, ¿cómo solicitas objetos de los que quieres que se inyecte el constructor? en su UI quiere acceder a su 'UserManager' que toma' IUserRepository' en construcción; ¿cómo se obtiene ese 'UserManager' sin acceso al núcleo (a través de algo así como un localizador de servicios)? No puedes simplemente 'nuevo UserManager (???);' y esperar que se entregue lo correcto a su constructor, ¿o sí? –

0

Mi punto de vista: como dijo Marek, usted debe crear un poco de envoltura (probablemente estática) para el núcleo, que contiene la instancia iKernel. Debe contener el método Resolve < T> y probablemente el método Load (INinjectModule module), todo estático.

En cada conjunto, puede simplemente definir su propio INinjectModule que mapea las clases dentro de este conjunto.

El envoltorio de kernel está en el ensamblaje más "bajo", el más común (normalmente el que tiene Log y Utils). Se debe a que Kernel debe ser accesible desde todas las partes, por lo que debe estar en el ensamblaje, al que hacen referencia todos los demás. Si no tienes uno, siempre eres lo suficientemente libre para crear uno. Esto puede parecer un poco complicado, uno podría esperar que Kernel estará en el ensamblado 'más alto' (el ejecutable). No es verdad.

Para registrar todos sus módulos desde sus ensamblajes, simplemente llame a Kernel.Load (nuevo XXModule) en cada uno de ellos.

Cuestiones relacionadas