6

posible duplicado:
Why do I need an IoC container as opposed to straightforward DI code?Las ventajas de resolución de dependencias y de la COI en asp.net mvc

He leído algunos artículos sobre este tema y que no encontrar ninguna ventaja brillantes. Por ejemplo, este código:

//some action in a controller 
//simplest solution: 
var repository = new EmployeeRepository(); 
var model = repository.ListAllEmployees(); 

bien se puede decir: en esta solución, el controlador/acción depende en gran medida del EmployeeRepository. La resolución de dependencias es:

var repository = DependencyResolver.Current.GetService<IEmployeeRepository>(); 
var model = repository.ListAllEmployees(); 

no he encontrado nada mejor que la siguiente sin ningún tipo de resolución de dependencias/COI:

var model = Managers.EmployeeManager.ListAllEmployees(); 

espero que alguien me puede dar algunas ideas/enlaces/mensajes de este tema.

Respuesta

5

La principal ventaja de la inversión del control es el desacoplamiento. Al desacoplar, mejora la capacidad de mantenimiento. Su controlador/acción depende de la interfaz y la implementación se inyecta en el controlador.

resolución de dependencias a través de un contenedor IoC simplifica la lógica de inyección de dependencias para su controlador mediante la configuración del recipiente. Donde esto realmente se vuelve claro es si una clase depende de un servicio, ese servicio depende de otros servicios y esos servicios también podrían depender de más servicios, el contenedor manejará esa resolución de dependencia.

Mucha gente podría decirle que implemente la inversión de control para poder probar su código, esto no es lo que ofrece la inversión de control, sí hace que su código sea más comprobable pero no es la razón principal.

10

Su ejemplo, con la DependencyResolver no es mucho mejor que su código original, así que sí .. no hay mucho ventaja de hacer eso.

Afortunadamente, esa no es la forma en que se supone que debes hacerlo. En cambio, usas la inyección de constructor o propiedad.

Estoy de acuerdo con @adriaanp, las pruebas unitarias más fácil es sólo un beneficio lado de inyección de dependencias. El mayor beneficio es que fomenta la arquitectura libre de dependencia. Sus clases son independientes y no dependen de una implementación específica (aparte de su interfaz y requisitos)

Otra ventaja es que un contenedor IoC puede controlar el tiempo de vida de sus dependencias. Supongamos que quiere que exista un objeto durante el tiempo de vida de la solicitud en la página web. Supongamos también que desea acceder a este objeto en muchas clases diferentes. Puede crear el objeto en su evento de carga de página y luego pasarlo a cada objeto que cree que lo necesite. Sin embargo, esto puede significar que necesita pasarlo a objetos que realmente no lo usan, simplemente porque crean objetos que lo necesitan (o crean objetos que crean objetos que lo necesitan, o ... y así sucesivamente).

Con la inyección de dependencia y un contenedor IoC, el contenedor controla el tiempo de vida del objeto, y se ocupa de inyectarlo en los objetos que lo necesitan. No tienes que construir esto en tus diseños. Usted acaba de obtener de forma gratuita.

Y, por último, para el problema de prueba.Cuando prueba algo, si tiene un nuevo código duro allí, no puede reemplazarlo fácilmente con un objeto burlado para alimentarlo con los datos de prueba. Supongamos que desea probar que un objeto calcula un valor correctamente. Alimentarlo con valores conocidos hace que sea más fácil realizar la prueba.

Cuestiones relacionadas