Dagger 2:Gradle 模块依赖与另一个模块中的实现

Dagger 2: Gradle module dependency with implementation in another module

我正在尝试建立一个项目,其中有两个模块 common-libapp

lib 模块有它自己的 Dagger 组件和模块,它应该是风格无关的。

现在,它的一部分取决于在模块 app 中声明的特定于风格的资源值,因此我尝试通过接口抽象组件并覆盖其在模块 app 中的实现。

Dagger 模块在 common-lib gradle 模块中声明,满足与 NoOp 实现的依赖关系。

    @Module
public class NetworkConfigModule {
    @Provides
    @Singleton
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){
        return noOpHeaderParams;
    }

    @Provides
    @Singleton
    AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){
        return noOpAppHostsProvider;
    }
}

Dagger 模块声明在app gradle 模块中,满足与实际实现的依赖关系。

@Module
public class NetworkConfigModule {

    @Provides
    @ApplicationScope
    HeaderParams providesHeaderParams(KaufdaHeaderParams kaufdaHeaderParams){
        return kaufdaHeaderParams;
    }

    @Provides
    @ApplicationScope
    AppHostsProvider providesAppHostsProvider(KaufdaAppHostsProvider implementation){
        return implementation;
    }
}

这是行不通的,因为 Dagger 不会覆盖模块 class,但这是意料之中的事情。

我的问题是,如何设置我的 Dagger 模块,以便我可以在 common-lib 中使用 HeaderParamsAppHostsProvider 接口,但我将它们的实现注入 app ].

最简单的方法是只处理 app 中的组件创建。

在您的应用程序中,您知道要使用的实际模块和 类。如果您在那里创建组件,您只需将正确的模块添加到组件中,注入您的 common-lib 类 即可完成。


如果您不想在应用中处理注入,则需要定义一个接口,例如

interface NetworkComponentHolder {
    NetworkComponent getNetworkComponent();
}

然后您可以在 app 中使用 Application 实施。同样,您必须在 app 中创建组件和模块,但随后您可以从您的模块中调用

((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this);

这是不使用反射的两种可能性。