在 Activity 之外注入时如何使用 Dagger2 排列组件?

How do I arrange components with Dagger2 when injecting outside of Activities?

所以我已经用 Android 研究了 Dagger2 一段时间,我开始思考如何注入依赖项。我了解对于构建组件,此代码最常见的地方之一是在您的应用程序 class 中。这样我就可以从我的各种活动中调用 getApplication().getMyComponent(),并将相关字段注入 Activity。

但是,假设我有一个 POJO,我想将另一个 POJO 注入其中(比如一个服务对象,其中包含一个 DAO 对象),我正在使用 POJOComponent 注入它。现在,我无法像以前那样在应用程序 class 中构建它,因为我不再注入 Activity(即无法访问 'getApplication()'),所以我的问题是;我应该只在服务对象中构建组件然后注入 DAO 吗?这对我来说似乎不正确,因为如果我想将 DAO 注入到不同的 object/class,我也需要在该对象中构建我的组件。

当然我只需要构建一次我的组件并用于将 DAO 注入不同的 objects/classes?我能想到的一种方法是在 Application class 中使用静态方法,但这感觉像是一种 hack。任何指导将不胜感激!

从不 使用静态方法或变量,如果可以的话。很可能有更好的方法。

如果您有一个 android.app.Service,该服务本身 is/has 一个 Context 并且您可以轻松地获得 Application and/or 创建一个新的具有该服务上下文的组件。

然后您可以像注入活动或片段一样注入它。


如果您将 Service 视为某种业务逻辑 class,那么您可以访问构造函数。在这种情况下,你可以——并且应该——利用构造函数注入.

如果你需要MyDao,把它放在构造函数中。不要养成这样的习惯,即每个 class 都获取并获取它需要的依赖项。如果有东西想使用你的服务,它需要用 dao 来提供它。

无论你在哪里使用你的服务class,那里你都应该考虑如何提供那些依赖。这很可能再次出现在 Activity、应用程序、片段或服务中,正如上面已经指出的那样,您将可以再次访问应用程序和组件。