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

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

為什么 Dagger 2 強迫我使用 @Provides 而不是 @Binds

為什么 Dagger 2 強迫我使用 @Provides 而不是 @Binds

慕桂英546537 2022-06-23 15:48:40
我現在正在研究 Dagger 2 (Java),一開始就遇到了一個問題。遺憾的是,我還沒有在 Dagger 2 文檔或 Stackoverflow 上找到任何關于它的內容,所以如果你們知道一些資源,我將不勝感激。我在此存儲庫中準備了一個最小示例來解釋我的問題:https ://github.com/stackoverflow-samples/dagger2-dependency-cycle所以我們得到了一個應該被構造的應用程序類public class Application {    @Inject    public Application(SomeDependency one) {    }    public static void main(String[] args) {        DaggerApplicationComponent.create().build();    }}...具有虛擬依賴public class SomeDependency {    @Inject    public SomeDependency() {    }}當然還有 Dagger 類/接口 ... .. 一個組件接口:@Component(modules = ApplicationModule.class)public interface ApplicationComponent {    Application build();}..和一個模塊:@Moduleabstract class ApplicationModule {    @Provides    static SomeDependency provideDepdendencyOne() {        return new SomeDependency();    }}我不明白為什么 Dagger 強迫我SomeDepdendency使用@Provides注釋注冊并且不允許通過以下方式注冊它@Binds:@Binds abstract SomeDependency bindDepdendencyOne(SomeDependency one);每當我將代碼從 更改為@Provides時@Binds,都會出現以下錯誤:[Dagger/DependencyCycle] Found a dependency cycle:      io.github.codejanovic.dagger2.example.SomeDependency is injected at          io.github.codejanovic.dagger2.example.ApplicationModule.bindDepdendencyOne(one)      io.github.codejanovic.dagger2.example.SomeDependency is injected at          io.github.codejanovic.dagger2.example.Application(one)      io.github.codejanovic.dagger2.example.Application is provided at          io.github.codejanovic.dagger2.example.ApplicationComponent.build()無法@Bind實現對我來說絕對沒有意義。我監督什么?
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

假設您需要@Binds或@Provides首先是錯誤的。您可以而且應該使用構造函數注入——不是模式,而是Dagger 為我生成代碼。


您已經有了用 注釋的構造函數@Inject,因此 Dagger 知道該類以及如何創建它。沒有別的事可做。


public class SomeDependency {


    @Inject

    public SomeDependency() {


    }

}

對于您的這個簡單用例,您不需要任何@Provides,不@Binds,甚至不需要 a 。@Module您的示例應該開箱即用,因為兩個構造函數都使用@Inject.


@Component

public interface ApplicationComponent {

    Application build();

}

如果您需要指定范圍,可以將其添加到類中。


@Provides應該用于不能使用構造函數注入的代碼,或者需要額外設置的代碼。當然,您可以手動創建所有對象(就像您在示例中所做的那樣),但這并沒有真正的好處,只會產生很多可以避免的樣板。


@Binds將與您需要綁定到接口的實現一起使用。最佳情況下,您也可以使用構造函數注入來實現,但您也可以將其添加到組件構建器 ( ) 或在帶注釋的方法@BindsInstance中創建它。@Provides


@Binds MyInterface bindMyImplementation(MyImplementation implementation);


查看完整回答
反對 回復 2022-06-23
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

如果您的類標有@Inject構造函數:


public class SomeDependency {


    @Inject // <----

    public SomeDependency() {


    }

}

然后,僅當您需要將其“綁定”為接口的實現或至少與其具體類型不同的類型時,才需要@Binds(或)。@Provides


另外,如果你的對象有一個@Inject構造函數,你不需要在模塊中實例化它,因為 Dagger 已經知道如何實例化它。


因此,要修復您的代碼,您需要做的就是:


// @Module

// abstract class ApplicationModule {

//     @Provides

//     static SomeDependency provideDepdendencyOne() {

//         return new SomeDependency();

//     }

// }

解決了。


查看完整回答
反對 回復 2022-06-23
  • 2 回答
  • 0 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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