Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对于Dagger 2,从其他模块访问1个模块内的实例的最佳方式是什么?_Android_Dagger 2 - Fatal编程技术网

Android 对于Dagger 2,从其他模块访问1个模块内的实例的最佳方式是什么?

Android 对于Dagger 2,从其他模块访问1个模块内的实例的最佳方式是什么?,android,dagger-2,Android,Dagger 2,只是在Android应用程序中试用Dagger2,我觉得可能会有一个更简单的解决方案来实现我的目标 我有两个模块: ApplicationModule,其生命周期与整个应用程序绑定,顾名思义 UserModule在用户登录时创建 现在假设我有一个在ApplicationModule中创建的singletonPrefs实例,但是我需要在UserModule中的类中访问它,那么最好的方法是什么?目前,我正在ApplicationModule中创建它,然后在创建时将其传递给UserModule的构

只是在Android应用程序中试用Dagger2,我觉得可能会有一个更简单的解决方案来实现我的目标

我有两个模块:

  • ApplicationModule
    ,其生命周期与整个应用程序绑定,顾名思义

  • UserModule
    在用户登录时创建

现在假设我有一个在
ApplicationModule
中创建的singleton
Prefs
实例,但是我需要在
UserModule
中的类中访问它,那么最好的方法是什么?目前,我正在ApplicationModule中创建它,然后在创建时将其传递给UserModule的构造函数。有没有办法避免这样做,让Dagger帮我解决这个问题

@Module
public class ApplicationModule {
    @Provides
    @Singleton
    public Prefs prefs() {
        return new Prefs();
    }
}

@Singleton
@Component(modules={ApplicationModule.class})
public interface ApplicationComponent {
    Prefs providePrefs();
}

@Module
public class UserModule {
    private Prefs prefs;

    public UserModule(Prefs prefs) {
        // Anyway to avoid having to do this?
        this.prefs = prefs;
    } 

    @Provides
    @UserScope
    public UserService userService() {
        // Possible to get the prefs from the ApplicationComponent?
        return new UserService(this.prefs);
    }
}

@Component(dependencies = {ApplicationComponent.class}, modules = {UserModule.class})
@UserScope
public interface UserComponent extends ApplicationComponent {
    UserService provideUserService();
}

dagger的全部目的是让它为您解决依赖关系。您不需要向模块中传递任何不直接需要的内容,比如用户模块的实际用户

依赖关系将通过dagger解决。在您的情况下,这意味着对代码进行如下调整:

@Module
public class UserModule {

    public UserModule() {
        // way of avoiding this code ;)
    }

    @Provides
    @UserScope
    public UserService userService(Prefs prefs) {
        return new UserService(prefs);
    }
}
这样,dagger将提供对方法的依赖关系。你不必自己做

这项工作的先决条件是可以实际提供依赖项。在您的情况下,
Prefs
由应用程序组件提供。只要您实例化了一个子组件,或者在您的案例依赖组件中实例化了一个公开依赖项的子组件,它就会在应用程序组件中使用Prefs()方法

如果提供依赖关系的模块位于同一组件中,这也会起作用


如果您的
UserService
不依赖任何其他内容,您甚至可以考虑删除整个模块,因为它看起来可以通过构造函数注入来提供

@UserScope
public class UserService {

    Prefs prefs;

    @Inject
    public UserService(Prefs prefs) {
        this.prefs = prefs;
    }
}

dagger的全部目的是让它为您解决依赖关系。您不需要向模块中传递任何不直接需要的内容,比如用户模块的实际用户

依赖关系将通过dagger解决。在您的情况下,这意味着对代码进行如下调整:

@Module
public class UserModule {

    public UserModule() {
        // way of avoiding this code ;)
    }

    @Provides
    @UserScope
    public UserService userService(Prefs prefs) {
        return new UserService(prefs);
    }
}
这样,dagger将提供对方法的依赖关系。你不必自己做

这项工作的先决条件是可以实际提供依赖项。在您的情况下,
Prefs
由应用程序组件提供。只要您实例化了一个子组件,或者在您的案例依赖组件中实例化了一个公开依赖项的子组件,它就会在应用程序组件中使用Prefs()方法

如果提供依赖关系的模块位于同一组件中,这也会起作用


如果您的
UserService
不依赖任何其他内容,您甚至可以考虑删除整个模块,因为它看起来可以通过构造函数注入来提供

@UserScope
public class UserService {

    Prefs prefs;

    @Inject
    public UserService(Prefs prefs) {
        this.prefs = prefs;
    }
}

谢谢你的回复,大卫,这些例子很有帮助。我确实有一个困惑,如果我像您在示例中那样删除UserModule构造函数中的参数,会在创建UserModule之前创建UserService吗?既然UserService现在已经实现了它的依赖关系,那么将UserService放在UserModule中是否会强制执行任何操作?@Mike您需要一个UserModule来创建您的组件,因此它将在之前创建。但这不应该产生影响。模块只是提供依赖性,如果它们不能由dagger自己创建感谢您的响应David,这些示例很有帮助。我确实有一个困惑,如果我像您在示例中那样删除UserModule构造函数中的参数,会在创建UserModule之前创建UserService吗?既然UserService现在已经实现了它的依赖关系,那么将UserService放在UserModule中是否会强制执行任何操作?@Mike您需要一个UserModule来创建您的组件,因此它将在之前创建。但这不应该产生影响。如果dagger本身无法创建模块,则模块只是提供依赖项