【问题标题】:Inject Dependencies into Singleton with Dagger?使用 Dagger 将依赖项注入单例?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我没有意识到 Dagger 让我如此方便地声明 Singletons。我不认为我周围有什么办法可以将每个将 Dispatcher 注入到 @Module 类数组的类都添加到@Module 类数组中吗?
  • @spierce7 否,要充分利用编译时验证,需要填写所有注入
  • 我来找的既是福也是祸。
  • 我有一个类似的问题 - 但@Sten Roger Sandvik 在这里描述的方式似乎不起作用?我正在使用 dagger 2 并在此处发布了一个问题 stackoverflow.com/q/31417795/1041533 - 如果有人可以检查它并指出我正确的方向,那就太好了。
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多