Можно ли сделать Dependency Inversion на уровне всего проекта

«Можно ли сделать Dependency Inversion на уровне всего проекта» — вопрос из категории Архитектура, который задают на 10% собеседований Frontend Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно. Dependency Inversion Principle (DIP) можно применить на уровне всего проекта, используя паттерны вроде Dependency Injection (DI) или Inversion of Control (IoC).

Пример с DI контейнером (на React):

// services.ts
export interface ApiService {
  fetchData(): Promise<any>;
}

export class RealApiService implements ApiService {
  async fetchData() {
    return fetch('/api/data');
  }
}

// App.tsx
import { ApiService } from './services';

function App({ apiService }: { apiService: ApiService }) {
  // Используем абстракцию, а не конкретную реализацию
  const handleClick = async () => {
    const data = await apiService.fetchData();
  };

  return <button onClick={handleClick}>Load</button>;
}

// index.tsx
import { RealApiService } from './services';
import { App } from './App';

const apiService = new RealApiService();

ReactDOM.render(
  <App apiService={apiService} />,
  document.getElementById('root')
);

Ключевые моменты:

  1. Абстракции (интерфейсы) определяют контракты
  2. Реализации зависят от абстракций
  3. Внедрение зависимостей происходит на верхнем уровне (composition root)