我如何使用存储库
How can I use Repository
我将 Dagger2 和 Moxy 与 MVP 一起使用。据我了解,Presenter 可以调用 Repository 来加载和卸载数据库中的数据。但是我只是想不出如何创建存储库的实例:在 Activity 中借助 Dagger 并传输到演示者或在演示者本身中?
我在 Activity 中使用了存储库,但我认为这是一种反模式。
它提供上下文
@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();
}
}
应用组件
@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();
}
}
流程应该是这样的
首先,您从视图调用一个方法给演示者。
然后,在您的演示者中,您需要与域层中的任何用例进行通信,并且该层负责使用匕首注入存储库。
举个例子
从你的演示者,你注入你的用例(交互者),这将是稍后与存储库通信的负责人
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)
}
这是要遵循的概念
我将 Dagger2 和 Moxy 与 MVP 一起使用。据我了解,Presenter 可以调用 Repository 来加载和卸载数据库中的数据。但是我只是想不出如何创建存储库的实例:在 Activity 中借助 Dagger 并传输到演示者或在演示者本身中?
我在 Activity 中使用了存储库,但我认为这是一种反模式。
它提供上下文
@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();
}
}
应用组件
@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();
}
}
流程应该是这样的
首先,您从视图调用一个方法给演示者。
然后,在您的演示者中,您需要与域层中的任何用例进行通信,并且该层负责使用匕首注入存储库。
举个例子
从你的演示者,你注入你的用例(交互者),这将是稍后与存储库通信的负责人
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)
}
这是要遵循的概念