从匕首 2 获取空实例
Getting null instance from dagger 2
我正在开发一个应用程序,我在其中定义了多个层并使用 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())
}
我假设 null 实际上是 databaseContext
而不是 getUserManager()
。因为我不确定你是如何实例化 UserService
.
构造函数注入需要 class 被注入,在提供参数类型的组件中实例化。在你的情况下,因为你没有它,那么你的 UserService
实际上没有被注射。
此外,DatabaseContext
提供程序需要在 userService()
所在的模块之一中才能使 UserService
构造函数注入工作,您已经这样做了。
@Singleton
@Component(modules = [ManagerModule::class]) // ManagerModule has DatabaseContext provider
class MyComponent {
fun userService(): UserService // this is how you get the instance of userService that is constructor injected.
}
因为您的 class 名称中包含服务。我假设你想要它的一个实例。您可以用 @Singleton
注释它,这样每次 userService()
调用 returns 同一个对象,否则它会创建一个新对象。
@Singleton
class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService
我在 ServicesModule 的方法中传递错误。所以我不得不用这样的方法传递它并且它起作用了:
@Provides
@Singleton
fun provideUserService(databaseContext : DatabaseContext()) : UserService = UserService(databaseContext )
我正在开发一个应用程序,我在其中定义了多个层并使用 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())
}
我假设 null 实际上是 databaseContext
而不是 getUserManager()
。因为我不确定你是如何实例化 UserService
.
构造函数注入需要 class 被注入,在提供参数类型的组件中实例化。在你的情况下,因为你没有它,那么你的 UserService
实际上没有被注射。
此外,DatabaseContext
提供程序需要在 userService()
所在的模块之一中才能使 UserService
构造函数注入工作,您已经这样做了。
@Singleton
@Component(modules = [ManagerModule::class]) // ManagerModule has DatabaseContext provider
class MyComponent {
fun userService(): UserService // this is how you get the instance of userService that is constructor injected.
}
因为您的 class 名称中包含服务。我假设你想要它的一个实例。您可以用 @Singleton
注释它,这样每次 userService()
调用 returns 同一个对象,否则它会创建一个新对象。
@Singleton
class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService
我在 ServicesModule 的方法中传递错误。所以我不得不用这样的方法传递它并且它起作用了:
@Provides
@Singleton
fun provideUserService(databaseContext : DatabaseContext()) : UserService = UserService(databaseContext )