第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么 Dagger 2 強(qiáng)迫我使用 @Provides 而不是 @Binds

為什么 Dagger 2 強(qiáng)迫我使用 @Provides 而不是 @Binds

慕桂英546537 2022-06-23 15:48:40
我現(xiàn)在正在研究 Dagger 2 (Java),一開始就遇到了一個(gè)問題。遺憾的是,我還沒有在 Dagger 2 文檔或 Stackoverflow 上找到任何關(guān)于它的內(nèi)容,所以如果你們知道一些資源,我將不勝感激。我在此存儲(chǔ)庫(kù)中準(zhǔn)備了一個(gè)最小示例來(lái)解釋我的問題:https ://github.com/stackoverflow-samples/dagger2-dependency-cycle所以我們得到了一個(gè)應(yīng)該被構(gòu)造的應(yīng)用程序類public class Application {    @Inject    public Application(SomeDependency one) {    }    public static void main(String[] args) {        DaggerApplicationComponent.create().build();    }}...具有虛擬依賴public class SomeDependency {    @Inject    public SomeDependency() {    }}當(dāng)然還有 Dagger 類/接口 ... .. 一個(gè)組件接口:@Component(modules = ApplicationModule.class)public interface ApplicationComponent {    Application build();}..和一個(gè)模塊:@Moduleabstract class ApplicationModule {    @Provides    static SomeDependency provideDepdendencyOne() {        return new SomeDependency();    }}我不明白為什么 Dagger 強(qiáng)迫我SomeDepdendency使用@Provides注釋注冊(cè)并且不允許通過以下方式注冊(cè)它@Binds:@Binds abstract SomeDependency bindDepdendencyOne(SomeDependency one);每當(dāng)我將代碼從 更改為@Provides時(shí)@Binds,都會(huì)出現(xiàn)以下錯(cuò)誤:[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()無(wú)法@Bind實(shí)現(xiàn)對(duì)我來(lái)說(shuō)絕對(duì)沒有意義。我監(jiān)督什么?
查看完整描述

2 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

假設(shè)您需要@Binds或@Provides首先是錯(cuò)誤的。您可以而且應(yīng)該使用構(gòu)造函數(shù)注入——不是模式,而是Dagger 為我生成代碼。


您已經(jīng)有了用 注釋的構(gòu)造函數(shù)@Inject,因此 Dagger 知道該類以及如何創(chuàng)建它。沒有別的事可做。


public class SomeDependency {


    @Inject

    public SomeDependency() {


    }

}

對(duì)于您的這個(gè)簡(jiǎn)單用例,您不需要任何@Provides,不@Binds,甚至不需要 a 。@Module您的示例應(yīng)該開箱即用,因?yàn)閮蓚€(gè)構(gòu)造函數(shù)都使用@Inject.


@Component

public interface ApplicationComponent {

    Application build();

}

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


@Provides應(yīng)該用于不能使用構(gòu)造函數(shù)注入的代碼,或者需要額外設(shè)置的代碼。當(dāng)然,您可以手動(dòng)創(chuàng)建所有對(duì)象(就像您在示例中所做的那樣),但這并沒有真正的好處,只會(huì)產(chǎn)生很多可以避免的樣板。


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


@Binds MyInterface bindMyImplementation(MyImplementation implementation);


查看完整回答
反對(duì) 回復(fù) 2022-06-23
?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您的類標(biāo)有@Inject構(gòu)造函數(shù):


public class SomeDependency {


    @Inject // <----

    public SomeDependency() {


    }

}

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


另外,如果你的對(duì)象有一個(gè)@Inject構(gòu)造函數(shù),你不需要在模塊中實(shí)例化它,因?yàn)?Dagger 已經(jīng)知道如何實(shí)例化它。


因此,要修復(fù)您的代碼,您需要做的就是:


// @Module

// abstract class ApplicationModule {

//     @Provides

//     static SomeDependency provideDepdendencyOne() {

//         return new SomeDependency();

//     }

// }

解決了。


查看完整回答
反對(duì) 回復(fù) 2022-06-23
  • 2 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)