hamper 𓅝
И правда, так работает.
🏁Александр
что-то попробывал с DI
🏁Александр
ну "такое"
🏁Александр
как мокать такие хедлеры не понятно
🏁Александр
придется мокать весь "супер обьект"
Aleksandr
покажи свой хэндлер
🏁Александр
type UsersHandler struct { app *application.MyApplication } func (h * UsersHandler) Index(w http.ResponseWriter, r *http.Request, p httprouter.Params) { ... h.app.GetResponce().EmptySuccess(w) }
🏁Александр
ну что-то в этом стиле
🏁Александр
самый минимальный показал
🏁Александр
ну и конструктор конечно: func NewClinicHandler(app *application.MyApplication) *UsersHandler { return &UsersHandler{ app: app, } }
Aleksandr
хэндлер у тебя зависит от приложения? странно
Aleksandr
обычно он зависит например от db-слоя, сервисов
🏁Александр
у меня есть пакет application
🏁Александр
в нем в фабрике - NewApplication стартуют все подключения, все что при инициализации делается
Aleksandr
так является ли application зависимостью для хэндлера?
🏁Александр
они свои "коннекты" кидают в стуктуру и эта структура уже начинает везде фигурировать
🏁Александр
так является ли application зависимостью для хэндлера?
она прозрачно прокидывает во все связи
🏁Александр
на самом деле там есть абстракция webserver, потом уже от нее идет прокидывания в хедлер того же самого
🏁Александр
я пытался избавиться от нудной правки зависимостей каждый раз
🏁Александр
это такое аналог DI
Aleksandr
ок. я отвечу за тебя. не является. прокидывать dic - это известный антипаттерн. если ты прокидываешь dic, то у тебя не di, а его имитация. Потому и протестить не сможешь нормально
🏁Александр
а что есть dic?
Aleksandr
di container
Aleksandr
контейнер твоих зависимостей
🏁Александр
так
🏁Александр
а как тогда правильно? если мы хотим таки DI
Aleksandr
прокидывать не dic, а конкретные зависимости
🏁Александр
а зачем нам тогда DI?
Aleksandr
а зачем нам тогда DI?
в вики прочти)
🏁Александр
да читал
🏁Александр
я думал что в этом и заключается
🏁Александр
что мы контейнер лихо пихаем везде и забывает про зависимости
🏁Александр
нет, это вообще не про то речь
может быть вы имеете введу что в DI должен "рефлектом" смотреть за зависимостями и подцеплять их?
🏁Александр
а хедлеры в тестах значит работают без DI и кормяться вручную
Roman
уже есть какие-нибудь фреймворки кодогенераторы декларативных API тестов?
🏁Александр
ну я просто знаю как в PHP сделан DI, все классы которым требуются зависимости дергаются через оберточку аля DI("/namespace/className") дальше уже движок разбирает что там в конструкторе за зависимости и пытается их накормить (если есть)
Roman
есть идея как реализовать декларативные тесты GraphQL апишек, определяешь: 1. query 2. ожидаемый JSON 3. conditions (макро-функции, реализуются в Go коде)
Dmitry
Коллеги, панику из горутины никак не отловить?
Dmitry
https://play.golang.org/p/N6NGMFH86g2
🏁Александр
https://play.golang.org/p/N6NGMFH86g2
не выйдет, вы стартуете новый поток
🏁Александр
в нем и отлавливайте
Dmitry
Т е автоматически никак.
🏁Александр
Т е автоматически никак.
https://play.golang.org/p/07uP2U2Z1Kd
Aleksandr
ну я просто знаю как в PHP сделан DI, все классы которым требуются зависимости дергаются через оберточку аля DI("/namespace/className") дальше уже движок разбирает что там в конструкторе за зависимости и пытается их накормить (если есть)
ты наверное забыл, но мы с этого разговора начали, когда ты появился в гошном чате. Нет, в пхп не так сделано. Ты рассказываешь какую-то определенную реализация ресолва зависимостей внутри контейнера. Конечно же не все контейнеры работают не рефлекте.
🏁Александр
ну окей
🏁Александр
в гоу то как принято с DI?
Aleksandr
в го не принято di, сам знаешь
Dmitry
https://play.golang.org/p/07uP2U2Z1Kd
Это означает что в контексте горутины нужно отлавливать и по другому никак?
Dmitry
Ок, спасибо
🏁Александр
в го не принято di, сам знаешь
когда я описывал свою с вашего позволения "архитектуру" никто даже не пикнул 🙁
🏁Александр
наоборот все говорили "ну зависимости надо статически отдавать и ок"
🏁Александр
в смысле методов наделать аля GetDB()
Aleksandr
в смысле методов наделать аля GetDB()
а в чем проблема? GetDb норм
🏁Александр
и где его простите применять?
🏁Александр
если я не могу контейнер с ним скоримть в хедлер
Aleksandr
и где его простите применять?
если это метод контейнера
🏁Александр
в данном случаи этот контейнер в структуре MyApplication
Aleksandr
postStore := NewPostStore(container.GetDb()) userStore := NewUserStore(container.GetDb())
🏁Александр
и зачем это?
🏁Александр
я с такми же успехом могу написать
Aleksandr
а не postStore := NewPostStore(container) userStore := NewUserStore(container)
🏁Александр
db := db.NewConnect() ostStore := NewPostStore(db) userStore := NewUserStore(db)
🏁Александр
почему тогда сразу не так?
🏁Александр
только сущность наплодили "лишную"
Aleksandr
и зачем это?
чтобы тестировать зависимости, а не зависимости зависимостей. Зачем твой компонент будет зависеть от чужих зависимостей, если должен зависеть от своих?
Aleksandr
db := db.NewConnect() ostStore := NewPostStore(db) userStore := NewUserStore(db)
можно так. ты же просто переименовал метод
🏁Александр
нихрена
Aleksandr
если он не создает новый коннект кажддый раз, то это норм
🏁Александр
создает
Aleksandr
ну а зачем?
🏁Александр
мы же в main и это уже вызов идет бд непосрдественно
Aleksandr
так что сказать то хочешь?