La inyecci贸n de dependencia consiste, como su nombre indica, en a帽adir, insertar dependencia a un objeto. Esto no es recomendable porque creas una dependencia grande entre objetos. Pero en ocasiones es la mejor soluci贸n que tenemos para asegurarnos de que el objeto B que usamos dentro del objeto A es el que queremos y como lo queremos, en lugar de uno que importemos.

Una interfaz puede ser algo como IDisposable, IEnumerable o IPrintable. Una clase es una implementaci贸n real de una o m谩s de estas interfaces: List o Map pueden ser implementaciones de IEnumerable.

Para entendernos: a menudo tus clases dependen unas de otras. P.ej. puedes tener una clase database que acceda a su base de datos, pero tambi茅n deseas que esta clase inicie sesi贸n para acceder a la base de datos. Supongamos que tiene un registrador (logger) entonces la base de datos tiene una dependencia al registrador.

Hasta aqu铆 todo bien.

Puede modelar esta dependencia dentro de su clase de Base de Datos con la siguiente l铆nea:

var logger = new Logger ();

y todo est谩 bien Est谩 bien hasta el d铆a en que se da cuenta de que necesita un grupo de registradores: a veces desea iniciar sesi贸n en la consola, a veces en el sistema de archivos, a veces usando TCP / IP y un servidor de registro remoto, y as铆 sucesivamente…

Y, por supuesto, NO quieres cambiar todo tu c贸digo (mientras tanto, tienes miles de millones) y reemplazar todas las l铆neas

var logger = new Logger ();

por:

var logger = new TcpLogger ();

Primero, esto no es divertido. En segundo lugar, esto es propenso a errores. Tercero, este es un trabajo est煤pido y repetitivo para un mono entrenado. Entonces, 驴Qu茅 haces?

Obviamente, es una buena idea introducir una interfaz ICanLog (o similar) que implementan todos los registradores. As铆 que el paso 1 en tu c贸digo es lo que haces:

ICanLog logger = new Logger ();

Ahora que la inferencia de tipo ya no cambia de tipo, siempre tienes una 煤nica interfaz contra la cual desarrollar. El siguiente paso es que no desee tener un nuevo Logger() una y otra vez. As铆 que pones la fiabilidad para crear instancias nuevas en una 煤nica clase central de f谩brica y obtienes un c贸digo como:

ICanLog logger = LoggerFactory.Create ();

La f谩brica misma decide qu茅 tipo de registrador crear. A su c贸digo ya no le importa, y si desea cambiar el tipo de registrador que est谩 utilizando, c谩mbielo una vez: Dentro de la f谩brica.

De esta manera con la interfaz te aseguras que todas las implementaciones de registrador, sea cual sea act煤en de la misma forma ya que implementan la misma interfaz. Esta 煤ltima 煤ltimo tramo de la publicaci贸n es una traducci贸n de una respuesta en StackOverflow la respuesta completa aqu铆.