1 回答
TA贡献1836条经验 获得超5个赞
但它不起作用
它没有指定,但我假设依赖注入不起作用。
注入至少需要两种不同的实体类型。一个被注射,第二个是接受注射的目标。
在您的情况下,您只有一个 - 以两种形式实现的注入gcp和azure.
您需要添加一个包含注入接口的目标:
type Target struct {
Specer Shooter
}
func (t *Target) DoWork() {
// here you can use t.Specer.Spec() without knowing implementation details
}
现在您可以Target使用 DI 创建:
func NewTarget(specer Shooter) *Target{
return &Target{
Specer: specer,
}
}
您的代码通常决定所有使用的类型并将它们注入(调用NewTarget())非常接近Composition Root中的应用程序启动
更新:
接口也可以注入函数。它也是依赖注入:
func kind(ev v1alpha1.Ev, namespace string, specer Shooter) (v1beta1.Shoot, error) {
...
shoot, e = specer.Spec(ev)
...
}
这是称为服务定位器的模式的替代方案:
func kind(ev v1alpha1.Ev, namespace string) (v1beta1.Shoot, error) {
...
specer := factory.GetSpecer()
shoot, e = specer.Spec(ev)
...
}
服务定位器通常称为反模式。
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报