關於Golang中的依賴注入實現

酒沉吟發表於2024-06-13

先定義一個內部呼叫介面 用於後面的注入

// 被 注入的介面
type UserFace interface {
    Get() string
    Set() string
}

然後定義一個 Struct ,開啟建構函式,並實現 上面的 介面

type SysUser struct {
    Name string
}

// User的建構函式
func NewSysUser(Name string) *SysUser {
    return &SysUser{Name: Name}
}

// 實現介面 UserFace
func (u *SysUser) Get() string {
    return "SysUser.Get"
}

// 實現介面 UserFace
func (u *SysUser) Set() string {
    return "SysUser.Set"
}

定義一個對 外部 (main 或者是 gin可以直接 呼叫的)呼叫介面

type MyFace interface {
    Sum(a int, b int) int
}

然後 定義外部Struct 用於實現上面的 外部 呼叫介面,並且 注入內部呼叫介面UserFace

// 定義結構體  並注入 UserFace
type MyStruct struct {
    UserFace UserFace // 注入 UserFace
}

// MyStruct建構函式
func NewMyStruct(face UserFace) *MyStruct {
    return &MyStruct{
        UserFace: face, // 注入 SysUser 系統使用者
    }
}

// 實現介面 MyFace
func (ms *MyStruct) Sum(a int, b int) int {
    getval := ms.UserFace.Get() // 呼叫 注入的 UserFace 的Get方法
    setVal := ms.UserFace.Set() // 呼叫 注入的 UserFace 的Set方法
    fmt.Println("MyStuct呼叫了UserFace Get: ", getval)
    fmt.Println("MyStuct呼叫了UserFace Set: ", setVal)
    return a + b
}

Main 使用 (注意:不能face.UserFace.Get() 這麼調,因為UserFace是介面型別,只能在實現 MyFace 介面並注入 UserFace的 MyStruct 裡呼叫 )

func main() {
    sysUser := NewSysUser("張三")            // 定義注入實體
    var face MyFace = NewMyStruct(sysUser) // 定義 外部 介面型別 並將實體注入
    result := MyFace.Sum(face, 1, 2)       // 呼叫外部介面方法
    fmt.Println(result)
    //face.UserFace.Get()   // 注意 不能這麼調,因為UserFace是介面型別
}

相關文章