Goはオブジェクト指向の言語ではないことを理解していますが、thisのようにIrisコントローラに継承構造を実装しようとしています。そのための私の主な動機は、繰り返しを避けることです。これまでのところ、私のために働いています。たとえば、次のコードを見てください。Golang Iris:親コントローラのモデルを子コントローラのモデルに初期化する
// APIController.go (package Controllers)
type APIController struct {
mvc.C
}
func (c *APIController) Post(data map[string][]string) ([]byte, error) {
data_parsed := c.ParseFormData(data)
return json.Marshal(data_parsed)
}
// UserController.go (package Controllers)
type UserController struct {
mvc.C
*APIController
}
func (c *UserController) Post() ([]byte, error) {
return c.APIController.Post(c.Ctx.FormValues())
}
これまでのところとても良いです。
しかし、私は同じ戦略をモデルに再現するのが難しいと感じています。これは私がこれまで
// Model.go (package Models)
type Model struct {
Id string `json:"_id"`
Created_at string `json:"created_at"`
Updated_at string `json:"updated_at"`
Deleted_at string `json:"deleted_at"`
}
// implements further set of functions to be used by 'child' models...
// User.go (package Models)
type User struct {
*Model
First_name string `json:"first_name"`
Last_name string `json:"last_name"`
Email string `json:"email"`
Username string `json:"username"`
Password string `json:"password"`
Last_login string `json:"last_login"`
}
// APIController.go (package Controllers)
type APIController struct {
mvc.C
Model Models.Model
}
// UserController.go (package Controllers)
type UserController struct {
mvc.C
*APIController
}
func (c *UserController) Post() ([]byte, error) {
c.APIController.Model = new(Models.User) //WRONG!
return c.APIController.Post(c.Ctx.FormValues())
}
UserControllerでは*Models.User
を通過する間、あなたが、APIControllerはタイプModels.Model
期待している見ることができるように行われてきたものです。最終的な目標は、APIControllerの汎用モデルを任意のコントローラから取得し、Models.Modelで定義されているすべての関数を呼び出すことができるようにすることです。この関数をどこでも呼び出す必要はありません。
これは可能ですか?そうでない場合、コードを繰り返さないようにするにはどうすればよいでしょうか?
更新
継承と、単一の親モデルを使用して、親APIController
に、私は私のフィルタ/ CRUDロジックを複製避けたいことを使用することにより。私はレコードを保存したい場合は代わりにUserController
内部User.Save(input_data)
の使用例については、UserController
の内側に、そして、Save
は理想的Models.Model
の内側とAPIController
から定義する必要があり、私は子供のコントローラから同じ呼び出しを行うのではなく、Model.Save(input_data)
を呼び出すことができますよ個別に
私はあなたがc.APIController.Model'は、あらゆるタイプのモデルを含むように 'たいことを理解し、しかし、どのようにモデルを使用したいのですか? – md2perpe
@ md2perpeは、正確な使用法についての質問を更新しました。 – Muavia