Оба подхода плохи тем, что из классового контракта неясно, каковы его зависимости. То есть
private void foo()
{
var x = SomeSingleton.Instance.GetX();
var y = ServiceLocator.GetService<IProvider>().GetY();
}
имеет ссылки на SomeSingleton
и IProvider
глубоко в земле.
Однако, по сравнению с чисто одноэлементным подходом, сервисные локаторы, как правило, намного лучше, так как они обеспечивают более простую централизованную конфигурацию, управление временем жизни и т. Д. Они также обеспечивают лучшую тестируемость (вы всегда можете имитировать вызовы GetService<T>
) сцепление, разделение концернов и т. д.