Peço desculpas se isso parece mais uma repetição da pergunta, mas toda vez que encontro um artigo sobre o assunto, ele fala apenas sobre o que é DI. Então, eu tenho DI, mas estou tentando entender a necessidade de um contêiner de IoC, no qual todo mundo parece estar se metendo. O objetivo de um contêiner de IoC é realmente apenas "resolver automaticamente" a implementação concreta das dependências? Talvez minhas aulas tendam a não ter várias dependências e talvez seja por isso que não vejo grande coisa, mas quero ter certeza de que estou entendendo a utilidade do contêiner corretamente.
Normalmente, divido minha lógica de negócios em uma classe que pode ser algo como isto:
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;
}
}
Portanto, ele possui apenas uma dependência e, em alguns casos, pode ter uma segunda ou terceira, mas não com tanta frequência. Portanto, qualquer coisa que chama isso pode passar por seu próprio repositório ou permitir que ele use o repositório padrão.
No que diz respeito ao meu conhecimento atual de um contêiner de IoC, tudo o que faz é resolver o IDataRepository. Mas se isso é tudo o que faz, não estou vendo muito valor, pois minhas classes operacionais já definem um fallback quando nenhuma dependência passou. Portanto, o único outro benefício em que consigo pensar é que se eu tiver várias operações como Se você usar o mesmo repositório de fallback, posso alterá-lo em um local que seja o registro / fábrica / contêiner. E isso é ótimo, mas é isso?
ConcreteRepository
e (2) você pode fornecer dependências adicionais ConcreteRepository
(uma conexão com o banco de dados seria comum, por exemplo).