首页 文章

Golang Iris:初始化父控制器's model to child controller'的模型

提问于
浏览
1

我知道Go不是面向对象的语言,但我正在尝试按照this文章的建议在我的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())
}

如您所见,APIController期望类型 Models.Model 而UserController传递 *Models.User . 最终目标是在APIController中拥有一个通用模型,来自任何控制器的任何模型然后能够调用Models.Model中定义的所有函数,这样我就不必在任何地方调用这些函数 .

有可能这样做吗?如果没有,那么避免重复代码的最佳方法是什么?

Update

通过使用继承和单亲模型并在父 APIController 中使用它,我想避免复制我的过滤器/ CRUD逻辑 . 例如,在 UserController 内,如果我想保存一条记录,那么 Save 应该在 Models.Model 中理想地定义 Save 而不是 APIController ,我可以调用 Model.Save(input_data) 而不是从子控制器进行相同的调用个别 .

1 回答

  • 1

    首先使 Model 成为一个接口而不是一个结构 . 它包含所有模型应该具有的所有方法:

    type Model interface {
        // Common methods
    }
    

    然后,只要 User 实现所有这些方法,你就可以拥有

    c.APIController.Model = new(Models.User) // Now works!
    

    其中一种常见方法可能是 Save . 否则使 Save 成为非方法:

    func Save(m Model) error {
        ...
    }
    

相关问题