【发布时间】:2019-11-18 07:27:14
【问题描述】:
我正在开发一个应用程序,其中定义了多个层并使用 dagger2 进行实例管理等。我有管理器、服务和视图。
我正在尝试在 @Module 中设置管理器,例如:
@Module
class ManagerModule {
@Provides
@Singleton
fun provideDatabaseContext(userManager: UserManager) : DatabaseContext {
var databaseContext : DatabaseContext = DatabaseContext();
databaseContext.setUserManager(userManager)
return databaseContext
}
@Provides
@Singleton
fun provideUserManager(store : PersistenceStore<DAOUser>) : UserManager = UserManager(store)
}
其中DatabaseContext是这样的:
class DatabaseContext : IDatabaseContext {
private lateinit var userManager: IUserManager
override fun getUserManager(): IUserManager {
return userManager;
}
fun setUserManager(userManager: IUserManager){
this.userManager = userManager;
}
}
当我像这样在我的服务中注入 DatabaseContext 时:
class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService {
override fun addUser(dtoUser: DTOUser, callback: ResponseCallback<Response<Void>>) {
var daoUser : DAOUser = DAOUser(dtoUser.name, dtoUser.email, dtoUser.password)
databaseContext.getUserManager().add(daoUser);
callback.onCompletion(Response<Void>())
}
}
一切正常,除了 getUserManager() 一直为空,即使我有 setUserManager 方法并且我在 ManagerModule 中进行设置,如上所示。任何帮助,将不胜感激。谢谢
这里是服务模块
@Module
class ServicesModule {
@Provides
@Singleton
fun provideUserService() : UserService = UserService(DatabaseContext())
@Provides
@Singleton
fun provideAuthenticationService() : AuthenticationService = AuthenticationService(FirebaseAuth.getInstance())
}
【问题讨论】:
-
您将
DatabaseContext作为DatabaseContext类型提供,而不是作为IDatabaseContext提供,这是否是您的示例代码中的拼写错误?就像现在一样,@Provide函数不能是用于注入IDatabaseContext的函数。如果您的代码像这样编译和运行,那么您在UserService中获得的任何IDatabaseContext都必须从其他地方提供。 -
目前是DatabaseContext。由于 IDatabaseContext 只是 DatabaseContext 继承的 getDatabaseContext 方法定义的接口
-
是的,我明白了。但是,如果您的方法返回
DatabaseContext类型,我相信您不应该将它作为IDatabaseContext注入某处。您确定没有其他方法可以在某处提供具体的IDatabaseContext类型吗? -
是的,我已经在管理器模块中提供了具体的 DatabaseContext。就在 ServicesModule 中,我在构造函数中使用了 DatabaseContext。我在我的问题中添加了 ServicesModule
-
我认为在 ServicesModule 中我必须这样做 @Provides @ Singleton fun provideUserService(databaseContext : DatabaseContext()) : UserService = UserService(databaseContext )