Ответ
Да, можно. 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')
);
Ключевые моменты:
- Абстракции (интерфейсы) определяют контракты
- Реализации зависят от абстракций
- Внедрение зависимостей происходит на верхнем уровне (composition root)