Dagger 2:组件依赖于多个作用域组件

10

我对Dagger 2还不是很熟悉。我正试图在我的Android项目中实现它。 我有一个需要GoogleApiClientService。我正在使用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();
}

AppModuleNetModuleRepositoryModule中有被标记为@Singleton @Provides的方法。

当我构建我的项目时,出现了以下错误:

LocationServiceComponent依赖于不止一个作用域为@Singleton的组件:@Singleton NetComponent @Singleton RepositoryComponent

我知道我的LocationComponent不能依赖于两个@Singleton作用域的组件,但是我需要它们两个在我的服务中,并且都需要是@Singleton

是否有更好的替代方案来实现同样的功能?


"我明白我的LocationComponent不能依赖于两个@Singleton作用域组件。" -> 你能解释一下为什么这是不可能的吗? - Pravin Sonawane
1
你可以在这里找到答案。 - blinker
1个回答

10

请注意,即使您可能有多个被标记为 @Singleton 的组件,它们的生命周期也将遵循您保留组件引用的类的生命周期。

这意味着,如果您在 Activity 中初始化并保留了 NetComponentRepositoryComponent,它将遵循该 Activity 的生命周期,而不会真正成为一个应用程序单例。

因此,在 Android 应用程序中,您可能不需要多个 @Singleton 组件。考虑将您的两个 Singleton 组件合并为一个组件,如下所示:

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

    DatabaseService getDatabaseService();
}

请确保在应用级别保留此@Singleton组件,并将其提供给在片段或活动级别初始化的依赖组件中使用。

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;
    }                   
}

请注意,只要您的@FragmentScoped本身没有任何依赖组件,您仍然可以创建任意数量的这些组件。

请注意,即使一个单一的组件现在注入了GoogleApiClientDatabaseService,您仍然可以实现关注点分离,因为它们是由不同的Dagger 2模块提供的。


1
这个解决方案很不优雅。你的 AppComponent 共享所有模块,而我想根据所需的配置和提供的组件的需要,能够从许多其他组件中组合我的组件。如何做到这一点?Crysis 引入了良好的结构。 - murt
@murt 正在尝试在非单例范围提供单例依赖项。这是行不通的。你是对的,他需要重新构建,但他需要按作用域分组组件 - 一个单一的应用程序作用域组件,然后是在 Activity 或 Fragment 级别的子组件或依赖组件。 - David Rawson
@murt 你可以查看一些使用依赖组件的其他答案 https://dev59.com/F1kR5IYBdhLWcg3w2wp1#40751767 - David Rawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接