存储库和用例之间有什么区别?
What is the difference between repositories and usecases?
我正在使用干净的架构创建一个聊天应用程序,我想在应用程序启动时检查用户是否登录,如果没有登录则打开登录屏幕,所以我的问题是:
实现它的最佳方法是什么?我是否应该将 LoginActivity
设置为启动器 activity 并检查 LoginPresenter
何时启动(如果用户已经登录)然后打开 MainActivity
?我应该把检查用户是否经过身份验证的逻辑放在哪里(IsLoggedInUseCase
也许?)?
我真的不明白存储库和用例之间的区别是什么,为什么我要制作 GetAllUsersUseCase
和 EditUserUseCase
.. 等,当已经有 UsersRepository.getAllUsers()
和 UsersRepository.editUser(User user)
?为什么要创建一个全新的 class 只是为了引用存储库中已经存在的方法?
简单地说,Use-Cases
处理您的业务逻辑,Repositories
是您存储和访问数据的数据层。
例如,当您打开启动器时 activity(我们称它为 SplashActivity
)
首先你开始你的Presenter
:
mSplashPresenter.start();
其次,在您的 Presenter 的启动方法中,您是否实现了用户是否登录的逻辑?如果是登录导航到仪表板,如果不是导航到 LoginActivity
.
我假设你有一个 LoginUseCase。
public void start(){
if(mLoginUseCase.isLoggedIn()){
mView.navitageToDashboard();
} else {
mView.navigateToLogin();
}
}
第三,你需要一个像下面这样的用例方法。 (我再次假设你有 UserRepository
)
public boolean isLoggedIn(){
// This is your business logic.
return mUserRepository.getCurrentUser() != null;
}
在你的 User Repository
:
public User getCurrentUser(){
// This is your data
// You can access remote or local data with repository.
return mLocalDataSource.getUser();
}
那么为什么我们需要用例?
这是一个简单的业务逻辑,决定用户是否登录。这可能是一个更复杂的业务逻辑,或者您想在其他演示者中使用此逻辑。因此,使用 Use-Cases
,您可以使您的业务代码可重复使用,并避免演示者中的代码重复。
稍后如果您想决定更改您的登录逻辑,您只需更改您的用例,而不是所有演示者。
让我们为您的问题确定一个逻辑:EditUser
。
您有一个存储库方法 UsersRepository.editUser(User user)
可以编辑用户。
您有一个 Profile
屏幕,用户可以在其中编辑所有字段。您还有一个 EditScreenDetail
屏幕,用户可以在其中编辑一些与屏幕详细信息相关的字段,其他人可以看到这些字段。
在两个屏幕中您编辑用户但是在调用UserRepository
方法之前您需要检查两个屏幕不同的必填字段。所以你定义了一个ProfileEditUseCase
和ScreenDetailsEditUseCase
来实现两种不同的业务逻辑。但是最后的操作是一样的。您通过回购编辑用户。来自远程或本地。
总结:
使用 Use-Cases
,您可以将业务逻辑与呈现器和数据层分开,避免呈现器中的代码重复。您还可以管理您的业务,这些业务可以在一个 class.
的其他部分使用
希望我解释清楚了。
我正在使用干净的架构创建一个聊天应用程序,我想在应用程序启动时检查用户是否登录,如果没有登录则打开登录屏幕,所以我的问题是:
实现它的最佳方法是什么?我是否应该将
LoginActivity
设置为启动器 activity 并检查LoginPresenter
何时启动(如果用户已经登录)然后打开MainActivity
?我应该把检查用户是否经过身份验证的逻辑放在哪里(IsLoggedInUseCase
也许?)?我真的不明白存储库和用例之间的区别是什么,为什么我要制作
GetAllUsersUseCase
和EditUserUseCase
.. 等,当已经有UsersRepository.getAllUsers()
和UsersRepository.editUser(User user)
?为什么要创建一个全新的 class 只是为了引用存储库中已经存在的方法?
简单地说,Use-Cases
处理您的业务逻辑,Repositories
是您存储和访问数据的数据层。
例如,当您打开启动器时 activity(我们称它为 SplashActivity
)
首先你开始你的Presenter
:
mSplashPresenter.start();
其次,在您的 Presenter 的启动方法中,您是否实现了用户是否登录的逻辑?如果是登录导航到仪表板,如果不是导航到 LoginActivity
.
我假设你有一个 LoginUseCase。
public void start(){
if(mLoginUseCase.isLoggedIn()){
mView.navitageToDashboard();
} else {
mView.navigateToLogin();
}
}
第三,你需要一个像下面这样的用例方法。 (我再次假设你有 UserRepository
)
public boolean isLoggedIn(){
// This is your business logic.
return mUserRepository.getCurrentUser() != null;
}
在你的 User Repository
:
public User getCurrentUser(){
// This is your data
// You can access remote or local data with repository.
return mLocalDataSource.getUser();
}
那么为什么我们需要用例?
这是一个简单的业务逻辑,决定用户是否登录。这可能是一个更复杂的业务逻辑,或者您想在其他演示者中使用此逻辑。因此,使用 Use-Cases
,您可以使您的业务代码可重复使用,并避免演示者中的代码重复。
稍后如果您想决定更改您的登录逻辑,您只需更改您的用例,而不是所有演示者。
让我们为您的问题确定一个逻辑:EditUser
。
您有一个存储库方法 UsersRepository.editUser(User user)
可以编辑用户。
您有一个 Profile
屏幕,用户可以在其中编辑所有字段。您还有一个 EditScreenDetail
屏幕,用户可以在其中编辑一些与屏幕详细信息相关的字段,其他人可以看到这些字段。
在两个屏幕中您编辑用户但是在调用UserRepository
方法之前您需要检查两个屏幕不同的必填字段。所以你定义了一个ProfileEditUseCase
和ScreenDetailsEditUseCase
来实现两种不同的业务逻辑。但是最后的操作是一样的。您通过回购编辑用户。来自远程或本地。
总结:
使用 Use-Cases
,您可以将业务逻辑与呈现器和数据层分开,避免呈现器中的代码重复。您还可以管理您的业务,这些业务可以在一个 class.
希望我解释清楚了。