Pido disculpas si esto parece una repetición más de la pregunta, pero cada vez que encuentro un artículo sobre el tema, en su mayoría solo habla sobre qué es DI. Entonces, recibo DI, pero estoy tratando de entender la necesidad de un contenedor de IoC, en el que todos parecen estar metiéndose. ¿El objetivo de un contenedor de IoC es realmente "resolver automáticamente" la implementación concreta de las dependencias? Tal vez mis clases tienden a no tener varias dependencias y tal vez es por eso que no veo el gran problema, pero quiero asegurarme de que entiendo la utilidad del contenedor correctamente.
Normalmente rompo mi lógica de negocios en una clase que podría verse así:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Por lo tanto, solo tiene una dependencia, y en algunos casos puede tener una segunda o tercera, pero no con tanta frecuencia. Entonces, cualquier cosa que llame a esto puede pasar su propio repositorio o permitirle usar el repositorio predeterminado.
En lo que respecta a mi comprensión actual de un contenedor de IoC, todo lo que hace el contenedor es resolver IDataRepository. Pero si eso es todo lo que hace, entonces no estoy viendo un montón de valor ya que mis clases operativas ya definen un retroceso cuando no pasó ninguna dependencia. Entonces, el único otro beneficio que puedo pensar es que si tengo varias operaciones como esto usa el mismo repositorio alternativo, puedo cambiar ese repositorio en un lugar que es el registro / fábrica / contenedor. Y eso es genial, pero ¿es eso?
ConcreteRepository
y (2) puede proporcionar dependencias adicionales a ConcreteRepository
(una conexión de base de datos sería común, por ejemplo).