2011-05-30 5 views
5

En un nivel alto, ¿cómo estos dep. marcos de inyección funcionan?¿Cómo funciona ninject en un nivel alto, cómo intercepta la instanciación de objetos?

puedo entender si siempre instancias de un objeto a través de una fábrica de encargo como:

IUser user = DepInjector.Get<User>(); 

estoy adivinando lo que sucede es, donde quiera que haya definido las asignaciones, se mira el tipo que desea y tratar y encuentra una coincidencia, si se encuentra, mediante instancia de reflexión creará el tipo.

¿Hay dep. inj. marcos que funcionarían como:

IUser user = new User(); 

Si es así, ¿cómo podría conseguir que el usuario correcto, ¿dónde está enganchar en el CLR para hacer esto? En el caso de un sitio web asp.net, ¿es diferente?

Respuesta

8

Si quieres saber cómo funciona Ninject, entonces el lugar obvio para comenzar sería leer How Injection Works en su wiki oficial. Se hace uso de la reflexión, pero ahora también utiliza métodos dinámicos:

"Por defecto, el StandardKernel se crear métodos dinámicos (a través de System.Reflection.Emit.DynamicMethod) que se puede utilizar para inyectar valores en los diferentes objetivos de inyección de estos. se activan los métodos dinámicos a través de llamadas de delegado. "

En cuanto a su segundo ejemplo, no creo que haya marcos DI que hagan lo que usted pida. Sin embargo, la inyección de constructores tiende a ser la forma más común de implementar IoC, por lo que cuando se construye una clase, sabe a qué tipo se vincula mediante algún enlace de configuración. Así que en su ejemplo IUser podría ser mapeadas al hormigón User en fijaciones de configuración para que cualquier clase consumidora que tiene un parámetro IUser como parte de su constructor sería conseguir la correcta User tipo se ha pasado.

+1

1 pero me gustaría [link para esto] (https://github.com/ninject/ninject/wiki/Dependency-Injection-With-Ninject) que explica que no hay nada de la magia que el OP suponga que podría haber bastante directamente –

2

AFAIK no hay forma de "enganchar" la instanciación de objetos con el CLR. La única forma de usar DI en el segundo caso sería emplear un reescritura de ensamblaje (es decir, un postprocesador similar a PostSharp) para reemplazar la llamada a new con una llamada al método de fábrica DI (es decir, GetUser) en el código compilado.

Cuestiones relacionadas