😫

【Golang】go-swaggerなどで自動生成された、引数が固定されたメソッドにその引数以外のものを渡したい

2022/07/21に公開

go-swaggerなどで自動生成された、引数が固定されたメソッドにその引数以外のものを渡したい

文字面だけ見ると、いや決まったもの以外渡すなよ、とか、渡したいならswagger変えれば、とお考えかと思いますが、その心を一旦calm downさせてください(((ノ´ー`)ノ
弊社のプロジェクトはgo-swaggerにて自動生成されているので(2回目)、handlerを自分達で定義はしているものの、引数は生成されたparamsの型のみを渡す、と決まっているので、「goにおけるオニオンアーキテクチャでのinterfaceの使い方」にて説明した、handler、usecase、repositoryをmainファイルで組み立てる(newする)が実現できず詰んでいました。具体的な詰みが下記です。

before

package main
//この引数に、handler packageの関数を入れる
api.UserGetHandler = user.GetUserHandlerFunc(handler.GetUserHandler)
package handler

func GetUserHandler(p userParams) middleware.Responder {
	//handlerの実装
}

  • このhandlerFuncの引数に自作したhandlerを入れなればならない
    handlerFuncの型は
type GetUserHandlerFunc func(GetUserParams) middleware.Responder

GetUserParams(生成されたパラメーターの構造体)を引数に受け取るし、middleware.Responderが戻り値でなければならない

というふうにガチガチに定義されています。

handlerの引数からusecaseやresponseのnew関数を渡したいという淡い期待が打ち砕かれました。

それをどう解決したかというと、下記です。

after

package handler

type User struct {
	usecase *usecase.User
}

func NewUser(u *usecase.User) User{
	return &User{usecase: u}
}

func (h *User) UserGet(params news.UserParams) middleware.Responder {
}
package main

userGetHander := handler.NewUser(usecase.NewUser(repo.NewUser()))
api.UserGetHandler = user.GetUserHandlerFunc(userGetHander.UserGet)
  • user.GetUserHandlerFuncに、userGetHander.UserGetを渡して、引数は生成されたparams,戻り値はmiddleware.Responderの関数を渡すことができている
  • handlerのnew関数の引数にusecase,repositoryのそれぞれのnew関数も渡すことができている。

Discussion