Dagger 2:组件依赖于多个范围组件

cry*_*sis 8 android dagger-2

我是Dagger 2的新手.我正在尝试在我的Android项目中实现它.我有Service需要的东西GoogleApiClient.我正在使用Dagger将其注入此服务中.

@FragmentScoped
@Component(dependencies = {NetComponent.class, RepositoryComponent.class})
public interface CustomServiceComponent {
    void inject(CustomService customService);
}

@Singleton
@Component(modules = {AppModule.class, NetModule.class})
public interface NetComponent {
    GoogleApiClient getGoogleApiClient();
}

@Singleton
@Component(modules = {AppModule.class, RepositoryModule.class})
public interface RepositoryComponent {
    DatabaseService getDatabaseService();
}
Run Code Online (Sandbox Code Playgroud)

AppModule,NetModule并且RepositoryModule有方法标记@Singleton @Provides 当我构建我的项目时,我收到此错误:

locationServiceComponent依赖于多个作用域组件:@Singleton NetComponent @Singleton RepositoryComponent

我理解我LocationComponent不能依赖于两个@Singleton范围的组件,但我需要在我的服务中同时使用它们@Singleton.

做同样的事还有更好的选择吗?

Dav*_*son 9

请注意,尽管您可能标记@Singleton了多个组件,但它们的生命周期将遵循保留组件引用的类的组件.

如果你初始化并留住这意味着NetComponent,并RepositoryComponent在活动中,将遵循活动的生命周期并不会真正成为一个应用程序单.

因此,您可能不需要@SingletonAndroid应用中的多个组件.考虑将两个Singleton组件组合成一个组件,如下所示:

@Component(modules = {AppModule.class, NetModule.class, RepositoryModule.class})
@Singleton
public interface AppComponent {
    GoogleApiClient getGoogleApiClient();

    DatabaseService getDatabaseService();
}
Run Code Online (Sandbox Code Playgroud)

然后确保@Singleton在应用程序级别保留此组件,并使其可用于在Fragment或Activity级别初始化的从属组件.

public class MyApp extends Application {

    private final AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerAppComponent.builder()
                           //modules if necessary
                           .build();
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }                   
}
Run Code Online (Sandbox Code Playgroud)

请注意,只要您@FragmentScoped自己没有任何依赖组件,您仍然可以根据需要创建任意多个组件.

请注意,即使单个组件现在注入GoogleApiClient,DatabaseService您仍然可以实现关注点分离,因为这些组件是在单独的Dagger 2模块中提供的.