🏁Александр
я просто не вижу смысла тогда от "контейнера"
🏁Александр
в твоей реализации
🏁Александр
если мы из него дергаем обьект и передаем
🏁Александр
какой смысл в контейнере?
🏁Александр
сразу создаем на месте обьект и передаем уже
🏁Александр
ну только инициализацию если спрятатать
Aleksandr
погоди, если ты хочешь прямо в main все создать - создавай
🏁Александр
блин я просто упроситил модель
🏁Александр
конечно же нет
Aleksandr
я тебе не контейнер показываю, а какие зависимости передавать
🏁Александр
еще раз, если мы берем коннект бд из контейнера и передаем, зачем нам контейнер? Кроме помощи в инициализации бд
🏁Александр
он откинулся до того как мы зашли в функцию
Roman
https://github.com/jaypipes/ghw
Roman
FYI
🏁Александр
Aleksandr
ключевое слово - ресолвер.
🏁Александр
что есть "резолвер"?
🏁Александр
type MyApplication struct {
db *db.Database
}
func (app *MyApplication) GetDB() *db.Database {
return app.db
}
🏁Александр
резолвер?
Aleksandr
нет, просто контейнер
Aleksandr
ты ушел от первоначальной проблемы
Aleksandr
инъекция контейнера vs инъекция зависимостей
🏁Александр
ну мы определили что я сделал не правильно
🏁Александр
передал контейнер в хедлер
Денис
Всем привет. А подскажите - в defer функции параметры расчитываются в момент появления defer в коде (а не в момент завершения функции). С коллером будет также?
Пример:
func (o *obj) foo() {
defer o.newTimer().stop()
//other_code
}
newTimer() - вызовется в самом начале функции, а stop() будет вызван в конце?
Илья
да
Денис
Спасибо
🏁Александр
🏁Александр
ээм
🏁Александр
а это к чему?
Aleksandr
🏁Александр
к GraphQL
у меня тут еще дополнительный вопрос, а как насчет каскадных зависимостей? Когда приложение кормиться в вебсервер, а вебсервер передает дальше в хедлеры (и оборачивает их)
🏁Александр
или же надо делать "все на 1 уровне"
🏁Александр
теоретически я мог бы хедлеры просто иницилизировать на уровне вебсервера и просто ему их скормить
Aleksandr
не совсем понял
🏁Александр
Вариант 1:
serv := http.NewWebServer(app)
serv.Lisner() // Внутри вызывается route который вызывает handlers
Вариант 2:
routes := handlers.NewRouters(app)
serv := http.NewWebServer(app)
serv.Lisner(routes)
🏁Александр
стоит ли там "оборачивать"
🏁Александр
или зависимости должны иди прозрачно без каскадов
Aleksandr
ну ты главное компонент к контейнеру не привязывай, а так делай как хочешь
🏁Александр
в ООП это как бы норм, глубина бывает по 7 элементов
Aleksandr
я вижу что ты в фабрику контейнер прокидываешь. это не про зависимости
🏁Александр
я решил на уровне main прокинуть в фабрику контейнер, а потом его там "растребушить" при инициализации
Roman
Aleksandr
Roman
извиняюсь за английский, но переписывать на русский лень)
🏁Александр
да, норм
так вопрос то в том, что если компонент который там вызывается и зовет другие компоенты
🏁Александр
по хорошему он бы тоже мог контейнер дальше переслать...
🏁Александр
у меня есть webserver
🏁Александр
самому ему зависимости не нужны никакие
🏁Александр
но хедлерам его нужны
🏁Александр
поэтому он получает экземляр контейнера и без "требушения" кидает в хенделы
🏁Александр
можно сделать по другому, выдрать инициализацию хендлеров "наверх" и там их иницилизировать
🏁Александр
и скормить ему же уже накормленные
🏁Александр
поэтому тут два варианта
Artem
Да вроде все в main инициализировать нужно
🏁Александр
Первый:
serv := http.NewWebServer(app)
serv.Lisner() // Для main не существует больше никаких суб зависимостей, они спрятаны внутри
🏁Александр
второй
🏁Александр
routes := handlers.NewRouters(app) // Мы вытащили зависимость наверх
serv := http.NewWebServer(app)
serv.Lisner(routes)
🏁Александр
в принципе мне кажется что второй вариант правильней
🏁Александр
но он несколько более многословный, что и смущает
Aleksandr
ну вот я делаю пакет container, который состоит только из геттеров/фабрик. таким образом вся инициализация в одном месте. В остальном коде я только получаю готовые инстансы.
Pawel
Sergey
древнее зло пробудилось
Dmitriy
коллеги, а есть ли у кого-нибудь проект в открытом доступе на swagger, в котором можно подглядеть как правильно разбивать спеку на несколько файлов?
Vladimir
Georgy
А кто какие библиотеки использует для работы с Docker API и как вы их мокаете? С Go работаю недавна, и вот встала передо мной такая задача
🎉
@ruelephant не покажешь кусок кода, как мне указатель на пул коннектов в листен передать? Ты вроде бы это делал. В одном файле проблемы нет, но когда хочу разнести по разным пакетам херня получается. То есть хэндлер лежит в db файле, и по другому что-то не втыкаю.
🏁Александр
O_o
🎉
Я вот так хочу
🎉
- bin
- user
-- model.go // package user
- cmd
-- appname
---- main.go // package main
- shared
-- libname
---- any.go // package libname
---- test.go
-- libnameTwo
---- any.go // package libnameTwo
---- test.go
- vendor
-- github.com
---- ....
что-то такое
"user" это домен, сам себе режиссер без зависимостей
если их много, то можно положить в entities
🎉
Только у меня есть ещё папка db, и хочется там все запросы оставить к базе.
🏁Александр
ну
🎉
Кажется нашёл статью, https://habr.com/post/269893/
🏁Александр
в чем трабла то?
🎉
ну
Вот в чём, это образец:
func main() {
var p db.Handler
db, err := p.InitDB()
if err != nil {
log.Fatal(err)
}
router := fasthttprouter.New()
router.POST("/", db.getHandler)
go func() {
log.Fatal(fasthttp.ListenAndServe(":4000", router.Handler))
}()
}
func (p *Handler) getHandler(ctx *fasthttp.RequestCtx) {
...
}
getHandler отработает только если будет лежать в папке db. Но хэндлеры как-то не красиво там обрабатывать? Есть варианты?
Dima
Здравствуйте хотел бы задать вопрос, какую ORM лучше использовать? Пробовал gorm, но криво создаются связи, думаю перейти на go-pg, стоит ли? Слышал ещё про reform)