2012-02-25 20 views
22

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?

+4

¿Por qué cerrar? ¿Qué tal tomarse el tiempo y dejar un comentario? – aryaxt

+0

-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. –

+1

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

Respuesta

16

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:

Programa

a 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 mensajes
  • ISecurityValidator<T> para la aplicación de las restricciones de seguridad en los mensajes
  • IRepository<T>, el patrón repositorio
  • IAuthorizationFilter<T> para aplicar autorización/filtrado de seguridad en consultas IQueryable<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.

2

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.

+0

dice que no se encuentra la página.! por favor actualice –

Cuestiones relacionadas