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 в неймспейсы.
См. также
- Inversion of Control и DI в Node — практические подходы в Node.js (factory, namespace injection, DI-контейнеры, AsyncLocalStorage)
- Dependency Injection
- Песочницы и safeRequire
- Фреймворк как загрузчик
- Dependency Inversion Principle