2016-12-01 64 views
6

我对匕首2很新。我试图在我的Android项目中实现它。 我有一个Service需要GoogleApiClient。我正在使用Dagger将其注入此服务中。匕首2:组件依赖于多个作用域组件

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

AppModuleNetModule,并RepositoryModule有方法标记@Singleton @Provides 当我建立我的项目,我得到这个错误:

The locationServiceComponent depends on more than one scoped component: @Singleton NetComponent @Singleton RepositoryComponent

我明白我的LocationComponent不能取决于两个@Singleton范围的组成部分,但我需要两个他们在我的服务和都需要是@Singleton

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

+0

“我明白我的LocationComponent不能依赖于两个@Singleton作用域组件” - >你能解释为什么这是不可能的吗? –

回答

6

请注意,虽然您可能有多个标记为@Singleton的组件,但它们的生命周期将遵循那些保留组件参考的类。

这意味着如果您在活动中初始化并保留您的NetComponentRepositoryComponent,它将遵循该活动的生命周期,并且不会真正成为应用程序单身人士。

因此,在Android应用程序中,您可能不需要超过一个@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模块中提供的。

+0

这个解决方案很脏。您的AppComponent共享所有模块,取而代之,我希望能够根据所需配置和所提供组件的需要,从其他许多组件构建我的组件。怎么做?孤岛危机引入井结构 – murt

+0

@ murt他试图在非单例范围内提供单例依赖关系。这是行不通的。你是对的,他需要重组,但他需要按范围对组件进行分组 - 一个应用程序范围的组件,然后是活动或片段级别的子组件或相关组件。 –

+0

@ murt您可以使用依赖组件查看一些其他答案https://stackoverflow.com/a/40751767/5241933 –