Dagger组织在多个库项目中共享依赖项?

时间:2017-10-16 23:03:25

标签: android dagger-2 dagger

什么是跨库项目共享依赖关系的最佳方式?我希望保持它们的独立性,只需要一些能明确告诉组件需要什么的东西,以及它将在内部提供什么的模块。

我可以让库都提供父应用程序可以添加到其组件的模块,但是如果多个模块提供相同的功能,Dagger将(正确地)错误输出。

1 个答案:

答案 0 :(得分:2)

我想我明白了:

库模块提供了他们需要的依赖关系DependencyInterface的接口。在内部,他们将使用自己的组件,这取决于DependencyInterface

集成应用程序只需要提供自己的“接口实现”。如果他们自己使用的是Dagger,那么AppComponent将只实现接口并让Dagger提供依赖关系。

例如:

图书馆组成部分:

@Component(
        modules = {
                // your internal library modules here.
        },
        dependencies = {
                LibraryDependencies.class
        }
)

public interface LibraryComponent {
    // etc...
}

public interface LibraryDependencies {

    // Things that the library needs, etc.
    Retrofit retrofit();

    OkHttpClient okHttpClient();
}

对于集成应用程序端:

@Singleton
@Component(
        modules = {
                InterfaceModule.class,
                // etc...
        }
)
public abstract class IntegratingAppComponent implements LibraryDependencies {
    // etc...
}


/**
 * This module is just to transform the IntegratingAppComponent into the interfaces that it
 * represents in Dagger, since Dagger only does injection on a direct class by class basis.
 */

@Module
public abstract class InterfaceModule {

    @Provides
    public static LibraryDependencies providesLibraryDependencies(IntegratingAppComponent component) {
        return component;
    }
}