Me he dado cuenta de que muchos desarrolladores definen una interfaz para CADA clase que se va a inyectar utilizando el marco DI. ¿Cuáles son las ventajas de definir Interfaces para cada clase?Dependency Injection & using interfaces?
Respuesta
Dejar que sus componentes de la aplicación (las clases que contienen la lógica de aplicación) implementar una interfaz es importante, ya que esto promueve el concepto de:
Programaa una interfaz, no una implementación.
Esto es efectivamente el Dependency Inversion Principle. Hacerlo le permite reemplazar, interceptar o decorar dependencias sin la necesidad de cambiar a los consumidores de tal dependencia.
En muchos casos, los desarrolladores violarán los principios SOLID, sin embargo, cuando tengan un mapeo casi uno a uno entre clases e interfaces. Uno de los principios que casi con toda seguridad se infringe es el Open/closed principle, porque cuando cada clase tiene su propia interfaz, no es posible ampliar (decorar) un conjunto de clases con preocupaciones transversales (sin trucos de generación de proxy dinámico).
En los sistemas que escribo, defino dos interfaces genéricas que cubren la mayor parte del código de la capa empresarial. Se llaman ICommandHandler<TCommand>
y un IQueryHandler<TQuery, TResult>
:
public interface ICommandHandler<TCommand>
{
void Handle(TCommand command);
}
public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
TResult Handle(TQuery query);
}
Además del buen efecto secundario de no tener que definir muchas interfaces, lo que permite una gran flexibilidad y facilidad de prueba. Puede leer más sobre él here y here.
Dependiendo del sistema escribo, también se podría utilizar interfaces, tales como:
IValidator<T>
para la validación de mensajesISecurityValidator<T>
para la aplicación de las restricciones de seguridad en los mensajesIRepository<T>
, el patrón repositorioIAuthorizationFilter<T>
para aplicar autorización/filtrado de seguridad en consultasIQueryable<T>
.
Dependiendo del sistema que escriba, entre el 80% y el 98% de todos los componentes implementan una de estas interfaces genéricas que defino. Esto hace que la aplicación de preocupaciones transversales a los llamados joinpoints trivial.
Esta entrada de blog tiene una gran cantidad de las respuestas que está buscando: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/
Si no diseña a las interfaces, que va a ser paralizado cuando llega el momento de refactorizar su código y/o agregar mejoras El uso de un marco DI no está realmente en cuestión cuando se trata de diseñar en una interfaz. Lo que DI te ofrece es de enlace tardío y una capacidad mucho mejor para escribir pruebas unitarias.
dice que no se encuentra la página.! por favor actualice –
- 1. Dependency Injection
- 2. Custom ResourceProviderFactory Dependency Injection
- 3. Dependency Injection and Factories
- 4. Cuándo utilizar Dependency Injection
- 5. MSTest TestMethod Dependency Injection
- 6. Android and Dependency Injection
- 7. Webforms and Dependency Injection
- 8. MVP dependency injection
- 9. Lazy Dependency Injection
- 10. Dependency Injection - ¿A quién pertenece la interfaz?
- 11. Symfony 2 Dependency Injection & autowiring
- 12. Dependency Injection en Sharepoint 2010
- 13. Dependency injection container? ¿Qué hace?
- 14. Unity Dependency Injection para servicios de WCF
- 15. Dependency Injection en .NET con ejemplos?
- 16. Grails Dependency Injection fuera de los servicios?
- 17. Dependency Injection como característica de idioma?
- 18. Delphi Dependency Injection: Framework vs Delegating Constructor
- 19. Guice dependency injection for entity beans?
- 20. Dependency Injection para objetos que requieren parámetros
- 21. Spring Dependency Injection and Plugin Jar
- 22. ¿Qué tan lejos llega Dependency Injection?
- 23. Uso de Reader Monad para Dependency Injection
- 24. Dependency Injection en una aplicación n-tier?
- 25. Dependency injection: ¿Cómo pasar el contenedor de inyección?
- 26. Uso de Dependency Injection en ASP.NET MVC3 Model Binder
- 27. Estoy usando Dependency Injection: ¿qué tipos debo enlazar como singletons?
- 28. Uso de Dependency Injection como alternativa a Singletons
- 29. Cómo evitar la locura del constructor de Dependency Injection?
- 30. IoC Dependency Injection para objetos con estado (no global)
¿Por qué cerrar? ¿Qué tal tomarse el tiempo y dejar un comentario? – aryaxt
-1 Ver los puntos de preguntas frecuentes "¿Qué tipo de preguntas puedo hacer aquí?" y "¿Qué preguntas no debería hacer aquí?". Ellos son los primeros dos en la lista. –
Su pregunta es válida e interesante, pero es un poco vaga y no muy específica (sin ejemplos de código, por ejemplo), por lo que las personas votaron negativamente y votaron para que se cerrara. – Steven