【发布时间】:2014-01-16 17:12:24
【问题描述】:
是否可以让 Dagger 为您注入单例?
就目前的情况而言,我只找到了一种手动向单例提供依赖项的方法:
@Provides
@Singleton
public Dispatcher providesDispatcher(Context context, PPreferences preferences,
FileNameCache fileNameCache) {
return new Dispatcher(context, preferences, fileNameCache);
}
这是定义单例的唯一方法吗?我更喜欢做如下的事情,这样 Dagger 就会自己注入依赖项,但是这样做会给我一个错误。
@Provides
@Singleton
public Dispatcher providesDispatcher(Dispatcher dispacher) {
return dispacher;
}
也许还有另一种定义单例的方法,可以让我将其他单例注入其中?
感谢任何帮助。
编辑: 我刚刚意识到我正在使用另一个 Singleton 执行第二种方法,但情况略有不同,因为我将实现映射到接口:
@Provides
@Singleton
public Tracker providesTracker(TrackerImpl tracker) {
return tracker;
}
TrackerImpl 也被注入了上述 PPreferences 的实例。
当我尝试使用第二个示例创建调度程序时,这是我得到的错误:
error: Unknown error java.lang.IllegalStateException thrown by javac in graph validation: Dependency cycle:
0. com.example.test.Dispatcher bound by @Singleton/ProviderMethodBinding[provideKey="com.example.test.Dispatcher", memberskey="null"]
0. com.example.test.Dispatcher
【问题讨论】:
-
为什么需要这样的结构?只是为了避免编写真正的单例代码?
-
我在编写单例代码方面没有问题,但由于我使用的是依赖注入,因此在整个应用程序中全面采用它是有意义的。如果您看一下 stenrs 的答案,它似乎比我想象的还要简单。
标签: java android dependency-injection dagger