Inversion of Control (IoC)

IoC — принцип, при котором управление потоком исполнения и созданием/предоставлением зависимостей переходит от пользовательского кода к фреймворку/контейнеру. DI — частный случай IoC.

Что это / Зачем

  • Раньше: код сам решает «когда и что вызывать», сам ищет зависимости через require/import.
  • IoC: фреймворк управляет жизненным циклом и подсовывает зависимости — пользовательский код становится пассивным.
  • Цель: подменяемость реализаций, изоляция модулей, тестируемость, декларативная композиция.

DI ⊂ IoC

DI — самый распространённый кейс IoC, но не единственный. К IoC также относятся:

  • Event-driven подход (фреймворк дёргает обработчики)
  • Шаблонные методы (наследник переопределяет шаги, базовый класс рулит)
  • Внедрение через песочницы (sandbox-based DI в Metarhia)

Пример: фреймворк подменяет require

// framework.js — даёт компоненту API вместо require
const api = { fs: require('fs'), log: console.log };
const sandbox = { api, console };
vm.createContext(sandbox);
const script = new vm.Script(componentSource);
script.runInContext(sandbox); // компонент видит api.fs, не require

Антипаттерн / Что НЕ делать

// Внутри компонента жёстко тащим зависимости — нет инверсии
const fs = require('fs');
const db = require('./db'); // подменить в тесте нельзя
function process() { db.query(fs.readFileSync('q.sql')); }

🎓 Источники

  • 🎓 [Inversion of Control and Dependency Injection in Node.js] · 2018-10-09 · YouTube
    • «DI — это частный случай инверсии управления. DI ⊂ IoC».
    • Альтернативная позиция: явный способ всегда лучше неявного, не злоупотреблять IoC везде.
  • 🎓 [Архитектурные принципы Metarhia] · 2023-12-06 · YouTube
    • В Metarhia IoC реализован через autobinding в неймспейсы.

См. также