Kirill
Нужно сценарии видео написать, примеры придумать. По сути, не добрался ещё до самого написания сценария курса
🏁Александр
я считаю нужно прямо брать какой то рестапи в ваакуме и реализовывать его
🏁Александр
с несколькими бд, интеграциями, тестированием
🏁Александр
а не hello world
🏁Александр
несколько бинарников, консольные обработчики и все прелести
🏁Александр
могу вписаться (в лс)
Aleksandr
закопипастил их примерчик - https://play.golang.org/p/ZqFgf4LSq_f
крайне многословно. я просто делаю пакет di и туда кладу ленивые фабрики - тут тебе и наглядность и типизация и никакой бесовщины
🏁Александр
примерчик бы
🏁Александр
можете набросать пседво структуру?
🏁Александр
это не совсем di конечно
🏁Александр
смысл di именно в внедрении зависимостей
🏁Александр
а тут у вас просто фабрики
Aleksandr
они у меня внедряются конечно
🏁Александр
в хедлерах например как дергаете?
Aleksandr
хэндлер создается так же через фабрику. вообще это же тот же самый контейнер, только раздроченный до самой простоты
Илья
в случае опечатки в ctn.Get("mysql") как это отлаживать? треш какой-то
🏁Александр
там ошибка же будет
Илья
эм, в рантайме
Fastumkruk
Всем привет. Имею функцию которая один раз сверяет число с другим и отправляет ответ, но одно из чисел меняется раз в одну две секунды, и поэтому функция не отвечает, потому что числа были равны. Как мне ждать пока число не изменится и только после этого давать ответ?
Илья
но если ты передаешь что-то в хендлер, почему не передать туда дб? :O ну, или интерфейс с нужными методами (который создается фабрикой с нужными компонентами)
Aleksandr
но если ты передаешь что-то в хендлер, почему не передать туда дб? :O ну, или интерфейс с нужными методами (который создается фабрикой с нужными компонентами)
это мне или попову? вообще мы вроде об этом и говорим и так и делаем (но я предыдущие 20 сообщенйи не прочел)
Илья
это Попову :)
Илья
можно сделать обертку, типа обзервер
Aleksandr
conn := ctn.Get("mysql").(*sql.Conn) conn := GetMysql() второй вариант лучше)
Илья
Можно мини пример цикла?
пример чего? for {}? я не очень понимаю ваши вводные, что? где? когда? пример на плейграунде?
🏁Александр
conn := ctn.Get("mysql").(*sql.Conn) conn := GetMysql() второй вариант лучше)
мил человек, а подключение ты тоже при первом вызове di.GetMysql() иницализируешь?
Илья
подключение можно на старте приложения сделать
Илья
даже не можно, а нужно
🏁Александр
тогда у нас появляется же "глобальная переменная" на уровне пакета, да?
🏁Александр
гениально!
🏁Александр
а конфиг не забыл?
🏁Александр
а обработка ошибок на старте
🏁Александр
или ты на первом клиенте упадешь с "access denied"
Aleksandr
а конфиг не забыл?
конфиг чего?
🏁Александр
конфигурации db конечно же
Aleksandr
а обработка ошибок на старте
а твой di будет это делать?) di обычно lazy
🏁Александр
как бы если вы внимательно прочитали
Илья
так там ни одной обрабтки ошибок нет
🏁Александр
Build: func(ctn di.Container) (interface{}, error) {
Илья
то есть там еще паники внутри?
🏁Александр
вы видите error?
🏁Александр
а чуть выше идет builder.Logger = &di.BasicLogger{}
Aleksandr
конфигурации db конечно же
не пойму что хочешь. я тупо твои di definitions вытащил в обычные функции.
🏁Александр
ну в твоем примере все ляжет на первом пользователе
Илья
эм, а твое приложение упадет?
🏁Александр
упадет
Aleksandr
вы видите error?
попов, успокойся. я набросал тебе пример как это можно проще реализовать. допиши error в конце каждой фунции сам
Илья
так зачем там абстрактный контейнер?
Aleksandr
да дело то не в error
а в чем? в тебе?
🏁Александр
нет, когда пользователь у тебя попадает в HandleFunc
🏁Александр
оно полезет в mysql
🏁Александр
и там будет ждать жопа, ибо база не была преинициализована
Aleksandr
у тебя сервис будет инициализирован ровно тогда, когда будет запрошен
Aleksandr
не так ли все известные тебе di работают?
Aleksandr
и улови суть: это деталь реализации. можешь error и прединициализацию добавить сам. мой подход заключается лишь в замене cnt.Get("mysql") на cnt.GetMysql(). Внутри же оно может работать одинаково или по разному
🏁Александр
ну ок, сейчас посмотрел и оно действительно не делает пре инициализацию
🏁Александр
бахнул NewApplication() которое инициализирует все в себе, если что аварийная остановка - логи там-же
🏁Александр
если все ок, вернет application который накормлен зависимостями
Илья
так почему их самому руками не проинициализировать и положить в какой-нить struct?
Илья
зачем там какая-то абстрактная фиговина? :)
Aleksandr
так почему их самому руками не проинициализировать и положить в какой-нить struct?
положить можно. инициализация на старте замедлит этот самый старт
Aleksandr
🏁Александр
ну окей
🏁Александр
значит структура и туда кормим
Илья
положить можно. инициализация на старте замедлит этот самый старт
ну, отделить можно то, что нужно, от того, что можно лениво инициализировать позже :)
Илья
значит структура и туда кормим
я у себя обычно делаю интерфейс Service, скрываю всю логику внутри, чтобы можно было протетстировать независимо от реализации
🏁Александр
совсем всю?
🏁Александр
какой смысл от него тогда
🏁Александр
или ты не про бизнес логику
Илья
в основном про бизнес, не люблю много кода в handler, тестировать содержимое ответов и так неудобно, внутреннюю кухню можно проверить в другмо месте
🏁Александр
а как в хедлеры это все безобразие кидаешь?
Илья
или как свойство хэндлера (если это struct) или через замыкание