[英]Golang Iris: Initialize parent controller's model to child controller's model
据我所知,围棋是不是一个面向对象的语言,但我想在我的虹膜控制器来实现继承结构所建议此文章。 我这样做的主要动机是避免重复。 到目前为止,它一直在为我工作。 以下面的代码为例。
// 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())
}
正如你所看到的,APIController期待型Models.Model
而UserController的是通过*Models.User
。 最终目标是在 APIController 中有一个通用模型,来自任何控制器的任何模型然后能够调用 Models.Model 中定义的所有函数,这样我就不必到处调用这些函数。
有可能这样做吗? 如果没有,避免重复代码的最佳方法是什么?
更新
通过使用继承和单父模型并在父APIController
使用它,我想避免复制我的过滤器/CRUD 逻辑。 例如,内部UserController
,如果我想保存记录,然后而是采用User.Save(input_data)
内UserController
,在Save
最好应中定义Models.Model
和APIController
,我能叫Model.Save(input_data)
而不是从子控制器单独进行相同的调用。
首先让Model
成为一个接口而不是一个结构体。 让它包含所有模型应该通用的所有方法:
type Model interface {
// Common methods
}
然后,只要User
实现了所有这些方法,您就可以拥有
c.APIController.Model = new(Models.User) // Now works!
常用方法之一可能是Save
。 否则使Save
成为非方法:
func Save(m Model) error {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.