現在Goで作ったAPIをクリーンアーキテクチャとなるようリファクタリングしています。
一番外側の層(infrastructure層)でhandlerを定義し、handlerは一つ内側のcontroller(interface層)のインターフェースに依存している状態です。
以下のuserHandler
とpostHandler
はそれぞれインターフェースをもっていてAppHandler
にこれらのインターフェースを埋め込んでいます。
registry.go
は依存関係を解決するためのもので、個々で詰まっています。
user_handler.go
package handler // handlerはcontrollerのインターフェースに依存 type userHandler struct { userController controllers.UserController } // インターフェース type UserHandler interface { CreateUser(c echo.Context) error GetUserByID(c echo.Context) error GetLoginUser(c echo.Context) error } // コンストラクタ func NewUserHandler(uc controllers.UserController) UserHandler { return &userHandler{userController: uc} } 以下インターフェースを満たすメソッドの定義
post_handler.go
package handler type postHandler struct { postController controllers.PostController userController controllers.UserController storageController controllers.StorageController } type PostHandler interface { CreatePost(c echo.Context) error GetPostIndex(c echo.Context) error DeletePost(c echo.Context) error } func NewPostHandler(pc controllers.PostController, uc controllers.UserController, sc controllers.StorageController) PostHandler { return &postHandler{pc, uc, sc} } 以下インターフェースを満たすメソッドの定義
app_handler.go
package handler type appHandler struct { userHandler UserHandler postHandler PostHandler } // すべてのハンドラのインターフェースを持つ type AppHandler interface { UserHandler PostHandler } func NewAppHandler(uh UserHandler, ph PostHandler) AppHandler { return appHandler{uh, ph} }
registry.go
package registry func (i *interactor) NewAppHandler() handler.AppHandler { return handler.NewAppHandler(i.NewUserHandler(), i.NewPostHandler()) }
クリーンアーキテクチャに関してはリンク内容を参考にさせてもらっていて、
このリポジトリのregistry/registry.go
では
func (i *interactor) NewAppHandler() handler.AppHandler { return i.NewUserHandler() }
このようにUserHandler
インターフェースをAppHandler
インターフェースとして返しています。
自分はAppHandler
インターフェースに複数のインターフェースを埋め込んでいるため、上のregistry.go
のようにしたのですが、以下のようなエラーが出ます。
infrastructure/api/handler/app_handler.go:19:19: cannot use appHandler literal (type appHandler) as type AppHandler in return argument: appHandler does not implement AppHandler (missing AuthUserLogin method)
(missing AuthUserLogin method
のAuthUserLogin
はAppHandler
に他に埋め込んであるインターフェースが持つメソッドで上のコードには省略してあります)
appHandler
はAppHandler
インターフェースを実装していないと言われます。
どのようにインターフェースを返してやれば、またはどのようにAppHandler
を定義してやればよいでしょうか。
長くて申し訳ありませんがよろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。