【问题标题】:How can I use Repository如何使用存储库
【发布时间】:2019-06-09 14:28:46
【问题描述】:

我将 Dagger2 和 Moxy 与 MVP 一起使用。据我了解,Presenter 可以调用 Repository 来从数据库中加载和卸载数据。但我就是想不通如何创建存储库的实例:在 Activity 中借助 Dagger 并转移到 Presenter 中还是在 Presenter 本身中?

我在 Activity 中使用了 Repository,但我认为这是一种反模式。

它提供上下文

 @Module
 public class AppModule {
   private Context context;

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

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

该模块提供 Room

 @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();
 }
  }

应用组件

@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();
 }
}

【问题讨论】:

    标签: android repository mvp presenter


    【解决方案1】:

    流程应该是这样的

    首先,你从你的视图调用一个方法给你的演示者。

    然后,在您的演示者中,您需要与域层中的任何用例进行通信,并且该层有责任用 dagger 注入存储库。

    我给你举个例子

    从您的演示者那里,您注入您的用例(交互器),这将负责稍后与存储库进行通信

    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 中,我只是注入了那个 repo

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

    这是要遵循的概念

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 2011-07-12
      • 2020-01-09
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      相关资源
      最近更新 更多