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