单身只在加'匕首图中

时间:2014-11-03 11:44:05

标签: android dagger

我有一个Dagger对象图,它能够隐式生成MyClass个实例,因为MyClass的构造函数是用@Inject注释的。

我还有一个模块plus放在我现有的图表上。我的目标是加上加号图,并且仅针对加号图,将MyClass视为单例,并始终返回相同的实例。

如何以最少的样板代码实现这一目标,即没有

a)通过编写@Provides @Singleton方法在plus'ed-on模块中构建实例,声明MyClass的所有依赖关系:

@Module public class Submodule {
  @Provides @Singleton MyClass provideMyClass(DepA depA, DepB depB) {
    return new MyClass(depA, depB);
  }
}

b)从MyClass中提取接口并再次编写提供者方法:

@Module public class Submodule {
  @Provides @Singleton IMyClass provideMyClass(MyClassImpl myClass) {
    return myClass;
  }
}

我的具体用例是Android应用程序,其中Activity实例依赖于演示者,该演示者也应该在活动的片段中注入。由于可能存在相同Activity的多个实例,因此我无法在全局范围内声明MyClass一个单例。

我想最后,问题归结为人们如何写这样的东西,没有依赖循环:

@Provides @Singleton public MyClass provideMyClass(MyClass m) { return m; }

1 个答案:

答案 0 :(得分:2)

我不认为这是可能的。您必须在某处提供@Singleton注释 对此的合法位置直接位于类声明之上,或者使用@Provides注释的方法。

考虑到这两个限制,您已经提出了所有可能的解决方案:类声明没有帮助,因为它只应该是加号图中的单例,而@Provides方法只能像你一样实现。


我能想到的唯一可能是这样做,就是将原始ObjectGraph提供给Submodule的构造函数,并使用ObjectGraph.get(MyClass.class)来以provideMyClass方式返回。当然,在创建MyClass实例时,不会使用子模块中任何被覆盖的依赖项。

我认为这种方法产生了太多的开销,并且与您建议的方法相比,引入了可能的(未来)错误。