亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 go 接口進行依賴注入

使用 go 接口進行依賴注入

Go
蠱毒傳說 2023-01-03 14:10:57
在閱讀了一些關于它的文檔后,我試圖通過 go 接口使用一些依賴注入。我有兩種方法應該實現一個接口type Shooter interface {    Spec(ev v1alpha1.Ev) (v1beta1.Shoot, error)}type Project struct {    Name string}https://github.com/JennyMet/testint/blob/master/internal/infra/common.go#L8具體實現在這里 https://github.com/JennyMet/testint/blob/master/internal/infra/azure/azure.go#L13 https://github.com/JennyMet/testint/blob/master/internal/基礎設施/gcp/gcp.go#L13例如func (n Project) Spec(ev v1alpha1.Ev) (v1beta1.Shoot, error) {    var shoot = v1beta1.Shoot{}    fmt.Println(shoot, ev)    return shoot, nil}現在我想在上面的包中獲得具體的實現,我嘗試了以下https://github.com/JennyMet/testint/blob/master/internal/infra/provider.go#L16func kind(ev v1alpha1.Ev, namespace string) (v1beta1.Shoot, error) {    var shoot v1beta1.Shoot    var e error    switch ev.Spec.Infrastructure.Type {    case "gcp":        project := gcp.Project{Name: namespace}        shoot, e = project.Spec(ev)        if e != nil {            return v1beta1.Shoot{}, e        }但這不起作用,有什么想法我該怎么做嗎?
查看完整描述

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)

   ...

}

服務定位器通常稱為反模式。


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號