3

是否可以让 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 的一个实例。

当我尝试使用第二个示例创建 Dispatcher 时,这是我得到的错误:

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
4

1 回答 1

9

您不需要有 @Provides 方法(在模块上)来创建 Dispatcher 单例实例。只需用@Inject 注释Dispatcher 构造函数,用@Singleton 注释类。每当您注入 Dispatcher 实例时,Dagger 都会使用该实例。

@Singleton
public class Dispatcher 
{
    @Inject
    public Dispatcher(..)
}
于 2014-01-21T17:19:30.147 回答