用Dagger将依赖注入Singleton?

时间:2014-01-16 17:12:24

标签: java android dependency-injection dagger

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也注入了上面提到的PP引用的实例。

当我尝试使用第二个示例创建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

1 个答案:

答案 0 :(得分:9)

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

@Singleton
public class Dispatcher 
{
    @Inject
    public Dispatcher(..)
}