Uma palavra: Não.
Mais palavras: a injeção de dependência é exatamente isso. É um meio pelo qual você introduz recursos dos quais outro objeto depende, mas não deve conhecer os detalhes intricados de outra fonte. O uso do DI não significa que NADA no seu programa deve saber como criar qualquer outro objeto; de fato, afirmo que é altamente inviável para um programa não trivial evitar completamente a "nova" palavra-chave (ou alternativas baseadas em reflexão). No entanto, o DI significa que objetos que não devem ter que saber como criar objetos complexos que exigem muitas dependências que irão acoplar esse objeto ao outro, não devem ter todo esse conhecimento de acoplamento rígido.
Eu estudaria as duas principais teorias do design de software de O / O, GRASP e SOLID. O GRASP solicitará que você estude o objetivo do objeto e se pergunte: "Esse objeto deve ser responsável por criar novos objetos desse outro tipo? Isso faz parte da 'descrição do trabalho' desse objeto?" O SOLID vai um passo além: o "S" representa o "Princípio da responsabilidade única", que afirma inequivocamente que um objeto deve ter um trabalho e deve ser o único objeto no programa que executa esse trabalho específico.
Portanto, o GRASP geralmente o incentivaria a procurar nas classes existentes as quais criar esses novos objetos e encontrar uma cuja tarefa de criar esse objeto se encaixa com o que o objeto já faz, mantendo o nível desejado de "coesão". O SOLID lhe dirá que a coesão é fundamental; a tarefa de criar esses objetos deve ser dada a alguma fábrica que deve ser injetada em sua classe. Acho que você descobrirá, à medida que a complexidade do seu programa continua a crescer, que a adesão a qualquer uma dessas metodologias, com vontade de refatorar, resultará em arquiteturas muito semelhantes.