3 回答
TA贡献1752条经验 获得超4个赞
是的,在 Go 中是可能的。
一个简单的 Go 的三步 DI 系统:
假设您有一个包 A,它不应该导入包 B,而是调用该包中的一些函数;例如,函数 Load() 和 Save()。
在包 A 中,使用这些函数定义一个接口类型。
type Storage interface {
Load(string) []byte
Save(string, []byte)
}
然后,包 A 中的类型可以引用该接口并调用 Load() 和 Save(),而无需知道这些调用的实际接收者。
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 中,实现 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()
现在您可以添加其他存储提供(包 C、D、...)并将它们连接到main.
storage2 := C.StructC
a2 := A.NewStructA(storage2)
a2.Save()
此处有更详细的讨论:https ://appliedgo.net/di/
TA贡献1799条经验 获得超6个赞
- 3 回答
- 0 关注
- 107 浏览
添加回答
举报