Sì, molte persone considerano il localizzatore di servizio come un anti-modello. A seconda di come è implementato, può essere difficile il codice di test unitario che lo utilizza, riduce la flessibilità perché i client possono avere solo un'implementazione singola di ogni interfaccia e si affida al test del tipo di runtime in modo che vari errori possano essere rilevati solo a tempo di esecuzione (spesso solo durante l'esecuzione, se i client ritardano l'individuazione dei servizi finché non sono necessari).
L'iniezione di dipendenza tramite parametri del costruttore è la preferenza più comune. Rende le dipendenze di una classe una parte esplicita della sua interfaccia. In un linguaggio tipizzato staticamente, consente al compilatore di verificare che tutte le dipendenze siano soddisfatte (a meno che non si usi un framework che utilizza la reflection, nel qual caso il runtime della lingua lo assicura durante l'inizializzazione del contenitore). E provare in isolamento è banale.
Probabilmente non hai bisogno di un framework DI. Possono risparmiare un po 'di lavoro, ma fare il DI manualmente ti dà il vantaggio del controllo statico del tipo, il che vale la maggior parte del tempo.