簡體   English   中英

Golang Iris:將父控制器的模型初始化為子控制器的模型

[英]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.ModelAPIController ,我能叫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM