🏁Александр
я просто не вижу смысла тогда от "контейнера"
🏁Александр
в твоей реализации
🏁Александр
если мы из него дергаем обьект и передаем
🏁Александр
какой смысл в контейнере?
🏁Александр
сразу создаем на месте обьект и передаем уже
🏁Александр
ну только инициализацию если спрятатать
Aleksandr
погоди, если ты хочешь прямо в main все создать - создавай
🏁Александр
блин я просто упроситил модель
🏁Александр
конечно же нет
Aleksandr
я тебе не контейнер показываю, а какие зависимости передавать
🏁Александр
еще раз, если мы берем коннект бд из контейнера и передаем, зачем нам контейнер? Кроме помощи в инициализации бд
🏁Александр
он откинулся до того как мы зашли в функцию
Roman
https://github.com/jaypipes/ghw
Roman
FYI
Aleksandr
еще раз, если мы берем коннект бд из контейнера и передаем, зачем нам контейнер? Кроме помощи в инициализации бд
незачем. но можно контейнер в фабрику передавать. и в фабрике уже вытаскивать зависимости. Плюс в контейнере можно спрятать всю инициализацию. В общем конntйнер - это единый ресолвер зависимостей.
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() будет вызван в конце?
Илья
да
⁣Денис
Спасибо
🏁Александр
инъекция контейнера vs инъекция зависимостей
ну ок. спасибо я ушел думать 🙂
🏁Александр
ээм
🏁Александр
а это к чему?
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
я вижу что ты в фабрику контейнер прокидываешь. это не про зависимости
Aleksandr
в ООП это как бы норм, глубина бывает по 7 элементов
трудно мысль уловить, но почитай закон Деметры, возможно ты про это
🏁Александр
я решил на уровне main прокинуть в фабрику контейнер, а потом его там "растребушить" при инициализации
Roman
Roman
Looking at my current GraphQL API testing Go code I just had an idea of making GraphQL tests more declarative, because tests are what you want to be very easy to read and understand, error-prone testing is the worst! 1. define a query 2. define test conditions 3. define the expected parametric result 4. define expected conditions 5. implement the declared conditions in Go code 6. optionally, define the tests dependencies on other tests You'd generate the actual test code using gqltestgen ./, it'll collect all .gqltst files, parse them, generate a apitestsuite_test.go which can then be executed with go test -v -race This would also allow generating an API test coverage. The dependencies (test hierarchy) are useful to determine which tests should be run first to avoid having test query.user fail before mutation.createUser if actually the user creation mutation fails, not the user query node. What would you say? Do you like this idea? Do you think it's somehow limited or anything? Please don't hesitate to share your thoughts with me :leichtes_lächeln:
Roman
извиняюсь за английский, но переписывать на русский лень)
🏁Александр
да, норм
так вопрос то в том, что если компонент который там вызывается и зовет другие компоенты
🏁Александр
по хорошему он бы тоже мог контейнер дальше переслать...
Aleksandr
так вопрос то в том, что если компонент который там вызывается и зовет другие компоенты
компонент зависит от трех других компонентов. где тут место контейнеру? получил из контейнера три компонента и все
🏁Александр
у меня есть 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
+1
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)