В чем разница между Dependency Injection и Service Locator

Ответ

Dependency Injection (DI) и Service Locator (SL) — это паттерны управления зависимостями, но с разными подходами.

DI внедряет зависимости извне (через конструктор, свойства или методы), делая их явными. Это упрощает тестирование и соблюдение принципа инверсии зависимостей (DIP).

class UserService {
  constructor(private db: Database) {} // DI через конструктор
}

Service Locator предоставляет централизованный контейнер, из которого зависимости запрашиваются внутри класса. Это скрывает зависимости, усложняя понимание кода и тестирование.

class UserService {
  private db = ServiceLocator.get<Database>('db'); // SL
}

Ключевые отличия:

  • DI прозрачен (зависимости видны), SL скрывает их.
  • DI упрощает мокирование для тестов, SL требует настройки контейнера.
  • DI следует принципу явных зависимостей, SL может привести к скрытым связям.

Ответ 18+ 🔞

А, слушай, смотри, про эти ваши паттерны управления зависимостями. Dependency Injection и Service Locator. Вроде оба про одно, а подход, сука, как небо и земля, блядь.

Вот смотри, Dependency Injection — это когда тебе всё честно, в лоб, в конструктор суют. Типа «на, держи свою базу данных, мудила, и не ори». Всё явно, всё видно. Зашёл в класс — и сразу понятно, на чём он там едет и что ему нужно для счастья.

class UserService {
  constructor(private db: Database) {} // DI через конструктор
}

Видишь? Прямо в рот ему запихивают эту Database. Красиво, прозрачно. Хочешь протестить — подсунул какую-нибудь хуйню-заглушку вместо настоящей базы, и всё, пизда тестам, они зелёные. Принципы эти твои, SOLID там всякие, они довольны, как удавы.

А теперь Service Locator, ёпта. Это ж какая-то тёмная магия, блядь. Класс сам, хитрая жопа, лезет в какой-то глобальный ящик и шарит там, что ему нужно.

class UserService {
  private db = ServiceLocator.get<Database>('db'); // SL
}

Смотришь на этот код и нихуя не понимаешь. А откуда, блядь, db возьмётся? А что там в этом ServiceLocator? А не подсунули ли ему, случайно, просроченный сыр вместо базы данных? Ты хз. Тестировать это — отдельный пиздец. Надо перед каждым тестом этот ебучий локатор настраивать, запихивать в него моки, а потом не забыть почистить. Овердохуища мороки.

Короче, разница пиздец какая:

  • DI — всё прозрачно, как слёзы ребёнка. Зависимости торчат наружу, и это хорошо.
  • SL — всё спрятано, как говно в кустах. Зависимости скрыты, и это пизда.
  • DI — для тестов рай. Подменил и забыл.
  • SL — для тестов ад. Вечно этот ёбаный контейнер корежит.
  • DI следует правилам, как пай-мальчик. SL — он как полупидор, вроде и помогает, но в итоге все связи запутывает в ебучую косу.

Вот и думай теперь. Один паттерн — как честное рукопожатие, а второй — как карманник в толпе, сука.