Инверсия управления и внедрение зависимостей в Node.js
ฝัง
- เผยแพร่เมื่อ 23 ส.ค. 2024
- Инверсия управления: github.com/How...
Внедрение зависимостей: github.com/How...
Курс «Основы программирования» с примерами на JavaScript habr.com/ru/po...
#javascript #IoC #DI #инверсия #управления #injection #dependency #лекции #js #программирование
наконец то я понял что такое Инверсия управления. огромное вам спасибо
определение DI дошло только в последние 5 минут, когда шло сравнение с dependency look up, после этого стала понятнее больше сама презентация. может стоит как то четче начинать саму презентацию с определения. Один слайд например ну и плюс какую нить картинку для визуализации - так легче воспринимать, чем просто речь на фоне слайда.
со второго просмотра зашло, код интересный, очень много интересных идей
Спасибо вам огромное!
Добрый день, переданная в setTimeout лямбда не обернётся, потому что она не последняя из аргументов "args[args.length - 1] = (...args) => {} " про это вы говорите тут 29:17
так и есть, контракт у таймеров в js не callback last
Здравствуйте Тимур. В лекции вы приводите такой пример (на 18 минуте): системный код передает прикладному какую-нибудь библиотеку или функцию, в прикладном коде вокруг метода библиотеки/функции можно сделать обёртку, и если в системном коде вызвать этот же метод/функцию, то из кода обёртки можно поменять что-то в контексте системного кода. У меня возник большой вопрос как это сделать, ведь стрелочная функция берёт контекст (this) в том месте где была объявлена, а для function expression контекстом будет объект в котором она вызовется. То есть в любом случае до глобального контекста в системном коде не получается добраться. Или я чего-то не учитываю?
Спасибо, сложно, надо пересмотреть и переварить через месяц-другой
Здравствуйте!
Как можно организовать запуск всех файлов проекта в одном контексте vm и как при этом делать пробросы модулей с помощью инъекций из фреймворка в несколько файлов?
И как такое можно организовать с паттерном MVC?
Или нужно в таком случае каждому роуту, контроллеру и каждой модели создавать свой vm контекст и каждый раз делать новые инъекции модулей?
В офф доке ноды по поводу VM модуля пишут следующее с первых строк - The vm module is not a security mechanism. Do not use it to run untrusted code. как это понимать? Мне с Vm модулем просто еще не приходилось работать
Так и есть, код, которому вы не доверяете вообще должен запускаться в более крепких контейнерах, лучше виртуалках, но можно и докере, хотя докер это тоже не секьюрити механизм.
17:28 а если написать delete api.console.log , не удалит во всех песочницах? Почему так?
И правильно ли я поинмаю, что если что-то встроить в global, например, глобальный конфиг-файл, то это тоже своего рода di?
global.config. {
....
}
Можно ли сказать, что внедрение зависимостей исползуется для повышения абстракции на уровне модулей?
Внедрение зависимости используется для неявного связывания модулей, на уровень абстракций это не влияет
Тимур, ещё скажите, пожалуйста, является ли паттерн фасад примером инверсии управления.
Нет, и мне даже непонятно, почему такое могло подуматься
@@TimurShemsedinov я подумал, что ПОЛУЧЕНИЕ кодом в файле application.js ссылки на библиотеку, например, fs и есть передача управления коду в этом файле над библиотекой fs. Я сравнил это с фасадом, ведь там тоже экземпляр одного класса получает возможность пользоваться методами другого класса.
@@TimurShemsedinov выходит, что нужно смотреть с другого конца. Скажите, пожалуйста, вот такой код будет являться инверсией управления.
const a = {...};
const b = {...};
const framework = (obj) => b.someMethod(obj);
framework(a);
Небольшой вопрос по присваиванию значения null коллбэку в примере с внедрением зависимостей. Вы сказали, что null присваивается для избежания выбрасывания исключения. Мне недавно приходилось работать с блоком кода, обернутым в try - catch - finally. Он выполнялся правильно только в том случае, если ключевая переменная скрипта не была равна undefined. В случае, если все же была равна, критичного для работы программы ничего не происходило, но выбрасывалась ошибка. Чтобы избежать ее, я в блоке catch присвоил null переменной error. Можно ли считать такой подход правильным?