El uso de IOC (inversión de control) en lugar de los singleton iniciados en el primer uso es ventajoso por otras razones también.
La inicialización de un soloton puede sufrir (famoso) problemas de multi-threading donde dos hilos intentan acceder a él por primera vez simultáneamente. Es probable que el acceso posterior se sincronice correctamente, pero el primero es mucho más difícil de hacer.
Otra gran ventaja que he encontrado al usar IOC es cuando puede ocurrir un error en la inicialización. No quiere que esto suceda con el "primer uso", quiere saber de esta falla en una etapa temprana, y ciertamente es más fácil manejar el error de esta manera.
Finalmente, con respecto a las pruebas, IOC proporciona el modelo perfecto para aislar componentes, sustituirlos según sea necesario y reunir diferentes combinaciones de una manera más flexible, proporcionando así el arnés perfecto para pruebas unitarias y pruebas de integración, como así como un buen mecanismo de reversión sin tener que revertir ningún código en absoluto.
La razón general por la cual los singletons se usan con tanta frecuencia no es por la unicidad sino por la globalidad. Si su proyecto se gestiona correctamente, tiene un único objeto global al que todos los demás "se registran" (por lo tanto, su modelo IOC se cuelga de él) y están disponibles globalmente mientras se siguen configurando.
Perfectamente correcto - IOC es el camino a seguir para estas cosas –