【问题标题】:Dagger 2: Component depends on more than one scoped componentDagger 2:组件依赖于多个作用域组件
【发布时间】:2023-03-26 09:26:02
【问题描述】:

我对 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();
}

AppModuleNetModuleRepositoryModule 具有标记为 @Singleton @Provides 的方法 当我构建我的项目时,我收到了这个错误:

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

我了解我的 LocationComponent 不能依赖于两个 @Singleton 范围的组件,但我需要在我的服务中使用它们并且都需要是 @Singleton

有没有更好的选择来做同样的事情?

【问题讨论】:

  • “我知道我的 LocationComponent 不能依赖于两个 @Singleton 范围的组件” -> 你能解释一下为什么这是不可能的吗?
  • 你可以在here找到答案

标签: android dagger-2


【解决方案1】:

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

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

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

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

    DatabaseService getDatabaseService();
}

然后确保在 Application 级别保留此 @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;
    }                   
}

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

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

【讨论】:

  • 这个解决方案很脏。您的 AppComponent 共享所有模块,而不是我希望能够根据所需的配置和提供的组件的需要从许多其他组件中组合我的组件。怎么做?结晶引入井结构
  • @murt 他试图在非单例范围内提供单例依赖项。那是行不通的。你是对的,他需要重组,但他需要按范围对组件进行分组 - 单个应用程序范围的组件,然后是 Activity 或 Fragment 级别的子组件或依赖组件。
  • @murt 您可以使用依赖组件查看其他一些答案stackoverflow.com/a/40751767/5241933
猜你喜欢
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多