Получение нулевого экземпляра из кинжала 2 - PullRequest
1 голос
/ 08 июля 2019

Я занимаюсь разработкой приложения, в котором я определил несколько слоев, и использую 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())
}

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Я предполагаю, что на самом деле ноль равен databaseContext вместо getUserManager(). Потому что я не уверен, как вы создаете экземпляр UserService.

Для внедрения в конструктор требуется, чтобы внедряемый класс создавался в компоненте, предоставляющем тип аргумента. В вашем случае, поскольку у вас его нет, ваш 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. 
}

Так как имя вашего класса содержит Сервис. Я предполагаю, что вы хотите один экземпляр этого. Вы можете аннотировать его с помощью @Singleton, поэтому каждый вызов userService() возвращает один и тот же объект, в противном случае он создает новый объект.

@Singleton
class UserService @Inject constructor(var databaseContext: IDatabaseContext) : IUserService

0 голосов
/ 09 июля 2019

Я передал это неправильно в методе ServicesModule. Поэтому я должен был передать его таким способом, и он работал:

 @Provides 
 @Singleton 
 fun provideUserService(databaseContext : DatabaseContext()) : UserService = UserService(databaseContext )
...