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 關注
- 100 瀏覽
添加回答
舉報