Использование IOC (инверсия управления) вместо синглетонов, инициируемых при первом использовании, также выгодно и по другим причинам.
Singleton-инициализация может страдать (как известно) из-за проблем с многопоточностью, когда два потока пытаются получить к ней доступ одновременно. Последующий доступ, вероятно, будет правильно синхронизирован, но сделать первый будет гораздо сложнее.
Еще одно огромное преимущество использования IOC, которое я обнаружил, - это когда при инициализации может произойти ошибка. Вы не хотите, чтобы это происходило при «первом использовании», вы хотите знать об этой ошибке на ранней стадии, и, конечно, проще обрабатывать ошибку таким способом.
Наконец, что касается тестирования, IOC предоставляет идеальную модель для изоляции компонентов, замены их по мере необходимости и более гибкого объединения различных комбинаций, обеспечивая тем самым идеальное использование как для модульного тестирования, так и для интеграционного тестирования. как хороший механизм отката без необходимости вообще возвращать какой-либо код.
Общая причина, по которой так часто используются синглтоны, не для единства, а для глобальности. Если ваш проект управляется правильно, у вас есть один глобальный объект, на который «регистрируются» все остальные (таким образом, ваша модель IOC зависает от него), и они доступны глобально, но все еще настраиваются.