android - 如何将 Activity 注入(inject)到正在注入(inject) Activity 的对象中?

标签 android dependency-injection dagger-2

我有这个模块:

@Module
public class UserProfileModule {

    @Provides
    @Singleton
    UserProfileController providesUserProfileController() {
        return new UserProfileController();
    }

}

这个组件:

@Component(modules = {UserProfileModule.class})
@Singleton
public interface AppComponent {

    void inject(UserProfileActivity activity);

}

到目前为止,在我的UserProfileActivity中,我可以@Inject一个UserProfileController。但现在,我需要将 UserProfileActivity 注入(inject)到 Controller 中。我的意思是,互相注入(inject)。

我可以通过在 UserProfileActivity 中调用 UserProfileController setter 来实现:setActivity(this);,但如果可以的话那就太好了自动。

如何实现这一目标?

谢谢。

最佳答案

对于初学者:将其添加到构造函数中。然后声明该依赖关系。

@Provides
@Singleton
UserProfileController providesUserProfileController(UserProfileActivity activity) {
    return new UserProfileController(activity);
}

这样做之后,dagger 会提示无法提供 UserProfileActivity ,除非您已经这样做了。如果不这样做,请添加另一个模块,或者仅提供同一模块的依赖项。实际实现如下,首先我们需要修复您的代码。

@Singleton 是对层次结构顶部的依赖。您不能(或者至少不应该)对 @Singleton 带注释的对象有 Activity 依赖性,因为这可能会导致难闻的气味和/或内存泄漏。引入自定义范围 @PerActivity 以用于 Activity 生命周期内的依赖项。

@Scope
@Retention(RUNTIME)
public @interface PerActivity {}

这将允许正确确定对象的范围。 另请参阅一些有关 dagger 的教程,因为这是一个非常重要的问题,用一个答案涵盖所有内容会太多。例如Tasting dagger 2 on android

以下内容通过扩展您的模块来使用上述两个选项的后一种方法:

@Module
public class UserProfileModule {

    private final UserProfileActivity mActivity;

    public UserProfileModule(UserProfileActivity activity) {
        mActivity = activity;
    }

    @Provides
    @PerActivity
    UserProfileActivity provideActivity() {
        return mActivity;
    }

    @Provides // as before
    @PerActivity
    UserProfileController providesUserProfileController(UserProfileActivity  activity) {
        return new UserProfileController(activity);
    }

}

如果您现在使用组件Builder,您可以使用 Activity 作为参数创建模块的新实例。然后将正确提供依赖项。

关于android - 如何将 Activity 注入(inject)到正在注入(inject) Activity 的对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802091/

相关文章:

asp.net-mvc-3 - 如何通过依赖注入(inject)使用 Entity Framework 上下文?

java - 如何使用 SAX Parser for Java 一次从一组 URL 解析多个 XML 提要?

android - 谷歌视觉 API 示例 : Get the CameraSource to Focus

android - 在 Mac OS X Lion 上构建 Android 4.0

android - Dagger2 - DoubleCheck 中的重复实例

android - java.lang.IllegalArgumentException : No injector factory bound for Class<MyActivity_> 异常

java - Dagger2 找不到带注释的方法

android - Google Maps Android v2 中的集群标记

在 APP_INITIALIZER promise 解决之前构建 Angular (v5) 服务

c# - 如何将对象注入(inject)到 WCF 服务中