在Dagger 2中使用范围的差异

时间:2017-02-14 18:34:06

标签: android dependency-injection dagger-2

我使用Dagger 2在我的应用程序中执行依赖项反转规则。我只是看Clean Architecture example by Fernando Cejas而我有一个问题 - 下面介绍的两种方法之间有什么区别:

如果我这样标记这个类:

@Singleton // or @PerActivity or @PerFragment, nevermind
public class UserDataStoreFactory {

  private final Context context;
  private final UserCache 
}

或者,如果我创建了一个模块,我在其中定义了一个提供方法并将该模块添加到任何组件中(PerActivity,PerFragment等等,永远不要)

@Module
public class SomeModule {
     @Provides
     @Singleton  // or @PerActivity or @PerFragment, nevermind
     UserDataStoreFactory providesUserDataStoreFactory (Context context, UserCache userCache) {
          return new UserDataStoreFactory(context, userCache)
     }
}

1 个答案:

答案 0 :(得分:2)

这两种方法是相同的:两者都允许在Singleton(或@ PerActivity / @ PerFragment / nevermind)范围内的整个应用程序中注入UserDataStoreFactory。

前一种方法,用范围标记类,只有在类具有@Inject-annotated构造函数时才有效。第二种方法不需要构造函数注释,但也需要额外的样板代码,当构造函数参数更改时,这些代码可能会发生变化。这使得第一种方法对UserDataStoreFactory上的依赖项更改更具弹性,即使它们在图形中都实现了相同的最终结果;但是,第一种方法可能只有在类可以更改的代码或者为结构化依赖项注入而构造的情况下才有可能。