Как я могу использовать репозиторий - PullRequest
1 голос
/ 09 июня 2019

Я использую Dagger2 и Moxy с MVP.Как я понимаю, Presenter может вызывать репозиторий для загрузки и выгрузки данных из базы данных.Но я просто не могу понять, как создать экземпляр репозитория: в Деятельности с помощью Dagger и переноса на докладчика или в самого докладчика?

Я использовал Репозиторий в Деятельности, но я думаю, что этоанти-шаблон.

Предоставляет контекст

 @Module
 public class AppModule {
   private Context context;

   public AppModule(Context context){
       this.context = context;
   }

   @Singleton
   @Provides
   Context provideContext(){
       return context;
   }
 }

Этот модуль предоставляет комнату

 @Module
 public class RoomModule {
   @Singleton
   @Provides
   AppDataBase providesAppDataBase(Context context) {
     return Room.databaseBuilder(context, AppDataBase.class, "budget")
             .fallbackToDestructiveMigration()
             .allowMainThreadQueries()
             .build();
   }

@Singleton
@Provides
BudgetDao providesDao(AppDataBase database) {
    return database.getBudgetDao();
 }

 @Singleton
 @Provides
 DetailDao providesDetailDao(AppDataBase dataBase){
     return dataBase.getDetailDao();
 }
  }

AppComponent

@Singleton
@Component(modules = {RoomModule.class, AppModule.class})
public interface AppComponent {

void inject(BudgetListPresenter presenter);

void inject(BudgetsActivity activity);

void inject(DetailActivity activity);
 }

Repository.class

 @Singleton
 public class BudgetListRepository implements BudgetRepository {
 private BudgetDao budgetDao;

 @Inject
 public BudgetListRepository(BudgetDao budgetDao){
     this.budgetDao = budgetDao;
 }

 @Override
 public void updateBudget(Budget budget) {
     budgetDao.updateBudget(budget);
 }

 @Override
 public void addBudget(Budget budget) {
     budgetDao.insertBudget(budget);
 }

 @Override
 public void deleteBudget(Budget budget) {
     budgetDao.deleteBudget(budget);
 }

 @Override
 public Budget getBudget(String id) {
     return budgetDao.getBudget(id);
 }

 @Override
 public List<Budget> getAll() {
     return budgetDao.getAll();
 }
}

1 Ответ

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

поток должен быть таким

Сначала вы вызываете метод от вашего представления к докладчику.

Затем в своем докладчике вам необходимо связаться с любым вариантом использования на уровне вашего домена, и этот уровень несет ответственность за внедрение в хранилище кинжала.

Позвольте мне показать вам пример

От вашего докладчика вы вводите свой сценарий использования (интерактор), это будет обязанность связаться с хранилищем позже

class LoginPresenter @Inject constructor(private val signInInteractor: SignInInteractor) : LoginContract.Presenter {
...

override fun signInWithEmailAndPassword(email: String, password: String) {
signInInteractor.signInWithEmailAndPassword(email, password)
...

Тогда ваш интерактор должен внедрить хранилище, как это

class SignInInteractorImpl @Inject constructor(val userRepository: UserRepository): SignInInteractor{
...

 override suspend fun pushUserIntoDatabase(account: GoogleSignInAccount): Unit = suspendCancellableCoroutine { continuation ->
        userRepository.createUser(account.displayName!!,account.email!!,object : UserRepository.UserRepositoryCallback{

            override fun onRemoteSuccess() {
                //success
            }

            override fun onRemoteFailure(errormsg:String) {
                //failure
            }

        })

    }

В этом случае я просто использую внутри своего варианта использования вызов в хранилище для передачи данных в Firebase

И в моем PresentationModule Я просто ввожу этот репо

 @Provides
    @Singleton
    fun provideUserRepositoryToLogin(userRepository: UserRepository): SignInInteractor {
        return SignInInteractorImpl(userRepository)
    }

Это концепция, которой нужно следовать

enter image description here

...