Dagger2组件具有多个依赖项

时间:2015-05-23 23:40:15

标签: java android dagger-2

这是我目前所拥有的并且有效:

@FragmentScope
@Component(dependencies = {FacebookComponent.class}, 
           modules = {FragmentFacebookLoginModule.class})
public interface FragmentFacebookLoginComponent {

    void inject(FragmentFacebookLogin fragment);
}

现在我想添加另一个依赖项。我改成了这个:

@Component(dependencies = {FacebookComponent.class, AnotherComponent.class}, 
           modules = {FragmentFacebookLoginModule.class})

但现在我收到此错误消息:

  

FragmentFacebookLoginComponent依赖于多个作用域   成分

我该如何解决这个问题?我如何拥有多个依赖项?

如果我从一个组件中删除作用域,我会收到以下错误消息:

  

AnotherComponent(unscoped)不能依赖于作用域组件

5 个答案:

答案 0 :(得分:4)

我在这里找到答案:https://stackoverflow.com/a/29619594/1016472

最后,我创建了一个具有正确范围的AppComponent,让FacebookComponent和AnotherComponent扩展这个AppComponent。

FacebookComponent和AnotherComponent没有自己的范围(我删除了它)。

现在看起来像这样:

@AppScope
@Component
public interface AppComponent {

}


@Component(modules = {FacebookModule.class})
public interface FacebookComponent extends AppComponent {

}


@Component(modules = {AnotherModule.class})
public interface AnotherComponent extends AppComponent {

}


@FragmentScope
@Component(dependencies = {FacebookComponent.class, AnotherComponent.class}, 
           modules = {FragmentFacebookLoginModule.class})
public interface FragmentFacebookLoginComponent {

    void inject(FragmentFacebookLogin fragment);
}

答案 1 :(得分:2)

您希望确定在ApplicationScope内的内容应该在没有范围的情况下定义,并且仅在应用范围内仅在给定范围内的ApplicationComponent中链接在一起。

例如,

@Component(modules = {FacebookModule.class})
public interface FacebookComponent {
    FacebookThing facebookThing(); //assuming this is with @Provides in FacebookModule with NO SCOPE
}


@Component(modules = {AnotherModule.class})
public interface AnotherComponent{
    AnotherThing anotherThing(); //assuming this is with @Provides in AnotherModule with NO SCOPE
}

然后你可以做

@AppScope
@Component(dependencies={AnotherComponent.class, FacebookComponent.class})
public interface AppComponent extends AnotherComponent, FacebookComponent {}

之后你可以做

@FragmentScope
@Component(dependencies=AppComponent.class)
public interface FragmentComponent extends AppComponent {}

请注意,未绑定的提供程序会在每次注入调用时创建一个新实例。如果你需要范围界定,你应该将模块绑定到同一个组件,但是组件应该只依赖于其他组件以实现子范围。

答案 2 :(得分:1)

您不能在依赖项数组中使用作用域组件(我不得不说这很奇怪),只能使用无作用域或一个作用域+其他无作用域。 但是您可以使用“代理”界面欺骗匕首:

@Component
@Singleton
interface ComponentA {
    fun provideSomeA()
}

interface ProxyComponentA : ComponentA

@Component
@Singleton
interface ComponentB {
    fun provideSomeB()
}

interface ProxyComponentB : ComponentB

@Component(dependencies = [ProxyComponentA::class, ProxyComponentB::class])
@OtherScope
interface ComponentC

但是在ComponentC构建器中,您应该使用代理组件实现,可以通过Kotlin轻松实现:

class ProxyComponentAImpl(private val delegate: ComponentA) : ProxyComponentA, ComponentA by delegate
class ProxyComponentBImpl(private val delegate: ComponentB) : ProxyComponentB, ComponentB by delegate

componentA = DaggerComponentA.builder()...
componentB = DaggerComponentB.builder()...

componentC = DaggerComponentC.builder()
                   .componentA(ProxyComponentAImpl(componentA))
                   .componentB(ProxyComponentBImpl(componentB))

使用匕首2.13版,不了解其他人

反之亦然,您可以使用继承ComponentA:ProxyComponentA来消除创建ProxyComponentAImpl的需要,但是如果您的ComponentA位于例如不同的gradle模块中,则这不是一个好的设计选择

该解决方案受到该问题讨论的启发: https://github.com/google/dagger/issues/1225

答案 3 :(得分:1)

现在Dagger支持一个可以依赖于1个以上范围依赖的组件。只需将您的匕首版本更新为2.27

https://github.com/google/dagger/issues/1414

api 'com.google.dagger:dagger:2.27'
kapt 'com.google.dagger:dagger-compiler:2.27'

答案 4 :(得分:0)

在模块中包含依赖模块,如下所示:

coverage-final.json