我有一个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; }
答案 0 :(得分:2)
我不认为这是可能的。您必须在某处提供@Singleton
注释
对此的合法位置直接位于类声明之上,或者使用@Provides
注释的方法。
考虑到这两个限制,您已经提出了所有可能的解决方案:类声明没有帮助,因为它只应该是加号图中的单例,而@Provides
方法只能像你一样实现。
我能想到的唯一可能是这样做,就是将原始ObjectGraph
提供给Submodule
的构造函数,并使用ObjectGraph.get(MyClass.class)
来以provideMyClass
方式返回。当然,在创建MyClass
实例时,不会使用子模块中任何被覆盖的依赖项。
我认为这种方法产生了太多的开销,并且与您建议的方法相比,引入了可能的(未来)错误。