Mat*_*any 1 mvp android repository-pattern clean-architecture
我正在使用干净的体系结构创建一个聊天应用程序,我想检查用户在应用程序启动时是否已登录,如果用户未登录则打开登录屏幕,所以我的问题是:
最好的实现方法是什么?我是否应该LoginActivity启动启动器活动并检查LoginPresenter启动时间(如果用户已经登录)然后打开MainActivity?我应该把检查用户是否已通过身份验证的逻辑放在哪里(IsLoggedInUseCase也许?)?
我真的不了解存储库和用例之间的区别是什么,当已经有and 时,为什么还要创建一个GetAllUsersUseCaseand ..etc 。为什么要制作一个全新的类来引用存储库中已经存在的方法?EditUserUseCaseUsersRepository.getAllUsers()UsersRepository.editUser(User user)
简单来说,Use-Cases处理您的业务逻辑,Repositories就是存储和访问数据的数据层。
例如,当您打开启动器活动(我们称之为 SplashActivity)时
首先,您开始Presenter:
mSplashPresenter.start();
Run Code Online (Sandbox Code Playgroud)
其次,在Presenter的start方法中,您是否实现了逻辑(无论用户是否登录)?如果是登录,请导航到仪表板,如果不是,请导航LoginActivity。
我假设您有一个LoginUseCase。
public void start(){
if(mLoginUseCase.isLoggedIn()){
mView.navitageToDashboard();
} else {
mView.navigateToLogin();
}
}
Run Code Online (Sandbox Code Playgroud)
第三,您需要一个如下的用例方法。(同样,我认为您有UserRepository)
public boolean isLoggedIn(){
// This is your business logic.
return mUserRepository.getCurrentUser() != null;
}
Run Code Online (Sandbox Code Playgroud)
并在您的User Repository:
public User getCurrentUser(){
// This is your data
// You can access remote or local data with repository.
return mLocalDataSource.getUser();
}
Run Code Online (Sandbox Code Playgroud)
那么为什么我们需要用例呢?
这是一个简单的业务逻辑,它决定用户是否登录。这可能是更复杂的业务逻辑,或者您想在其他演示者中使用此逻辑。因此,使用Use-Cases,您可以使业务代码可重复使用,并避免在演示者中重复代码。
以后,如果您要决定更改登录逻辑,则仅更改用例,而不是所有演示者。
让我们为您的问题决定一个逻辑: EditUser。
您有一个存储库方法 UsersRepository.editUser(User user)可编辑用户。
您有一个Profile屏幕,用户可以编辑所有字段。你也有一个EditScreenDetail屏幕,用户可以编辑一些与屏幕详细信息相关的字段,其他人可以看到这些字段。
在两个屏幕中,您都可以编辑用户,但是在调用UserRepository方法之前,您需要检查两个屏幕之间不同的必填字段。因此,您定义ProfileEditUseCase和ScreenDetailsEditUseCase来实现两个不同的业务逻辑。但是最终操作是相同的。您可以通过仓库来编辑用户。来自远程或本地。
摘要:
当Use-Cases您将业务逻辑与演示者和数据层分开时,请避免在演示者中重复代码。您还可以管理自己的业务,该业务可以在一类的其他部分中使用。
我希望我能清楚地解释。
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |