3 回答

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
是的,在 Go 中是可能的。
一個(gè)簡單的 Go 的三步 DI 系統(tǒng):
假設(shè)您有一個(gè)包 A,它不應(yīng)該導(dǎo)入包 B,而是調(diào)用該包中的一些函數(shù);例如,函數(shù) Load() 和 Save()。
在包 A 中,使用這些函數(shù)定義一個(gè)接口類型。
type Storage interface {
Load(string) []byte
Save(string, []byte)
}
然后,包 A 中的類型可以引用該接口并調(diào)用 Load() 和 Save(),而無需知道這些調(diào)用的實(shí)際接收者。
type StructA struct {
content []byte
storage Storage
}
func NewStructA(s Storage) *StructA {
return &StructA{
content: ...,
storage: s,
}
}
func (a *StructA) Save(name string) {
a.storage.Save(name, a.content)
}
func (a *StructA) Load(name string) {
a.content = a.storage.Load(name)
}
在包 B 中,實(shí)現(xiàn) Load() 和 Save()。
type StoreB struct {
poem []byte
}
func (b *StoreB) Save(name string, contents []byte) {
// let's say StoreB contains a map called data
b.data[name] = contents
}
func (b *StoreB) Load(name string) []byte {
return b.data[name]
}
在包裝main中,連接電線。
storage := B.StructB
a := A.NewStructA(storage)
a.Save()
現(xiàn)在您可以添加其他存儲提供(包 C、D、...)并將它們連接到main.
storage2 := C.StructC
a2 := A.NewStructA(storage2)
a2.Save()
此處有更詳細(xì)的討論:https ://appliedgo.net/di/

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
一個(gè)基于依賴注入的 Go 應(yīng)用程序框架。 https://github.com/uber-go/fx
Go 的基于反射的依賴注入工具包。https://github.com/uber-go/dig

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
是的,你應(yīng)該在 go 中考慮 DI,DI 在 go 中具有與任何其他語言相同的優(yōu)勢。在go中使用接口可以輕松實(shí)現(xiàn)。
- 3 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報(bào)