清洁架构和用户
Clean Architecture and user
我尝试在一个小应用程序中实现干净的架构 Android(只是为了测试这个干净的架构)。但是在我想测试 kotlin/multiplatform 之后。
但我无法弄清楚我该如何处理用户。
我的例子是用户可以是免费增值或高级。对于免费增值,数据存储在房间数据库中,对于高级版则存储在服务器中。当然,如果您 premium/freemium,应用程序设计会发生变化。
我创建了一个 UserUseCase,我可以在其中获取用户信息。但问题是我需要这个用户用于 ui 和 db,并且所有其他用例都需要此信息,我必须每次都调用 getUser 来获取有关用户的信息。
对于域:
data class User (
var id : String = "",
var city : String = "",
var country : String = "",
var email : String = "",
var name : String = "",
var status : Int = 0
)
class UserUseCase(userRepository: IUserRepository) : IUserUseCase {
override fun getUser(): User = userRepository.getUser()
}
另一个用例:
class NoteUseCaseImpl(private val noteRepository : INoteRepository, private val userRepository : IUserRepository) : INoteUseCase{
override fun getNotes(): List<Notes> = noteRepository.getNotes(userRepository.getUser())
override fun createNote(note: Note) = noteRepository.createNote(note, userRepository.getUser())
}
然后在存储库中:
class NoteRepository(private val localNoteRepo, private val serverNoteRepo) : INoteRepository{
override fun createNote(note:Note, user : User){
if(user.status == Status.Premium)
serverNoteRepo.createNote(note)
else localNoteRepo.createNote(note)
}
}
但我需要 UI 再次执行“getUser”以了解他的状态是 Premium 还是 Freemium,因此我在各处添加了“getUser”(UseCase、viewModel 等...)
有更好的解决方案吗?
我在 Whosebug 和 google 上看到了很多例子,但我找不到好的解决方案。
如果你有任何例子...谢谢
获取用户状态和创建注释是 ui 的两个不同用例。对于第二个,您只能从域层请求用户状态。
class NoteUseCaseImpl(private val noteRepository : INoteRepository, private val userRepository : IUserRepository) : INoteUseCase{
override fun createNote(noteText: String, noteDate: Date): Note {
val user = userRepository.getUser()
val premium = user.status == Status.Premium
return noteRepository.createNote(noteText, noteDate, user.id, premium)
}
}
class NoteRepository(private val localNoteRepo, private val serverNoteRepo) : INoteRepository{
override fun createNote(noteText:String, noteDate: Date, userId: String, premium: Boolean): Note {
return if(premium)
serverNoteRepo.createNote(noteText, noteDate, userId)
else
localNoteRepo.createNote(noteText, noteDate, userId)
}
无论如何,您也应该将笔记保存在本地数据库中。所以你需要使用存储库刷新策略改进这个变体
我尝试在一个小应用程序中实现干净的架构 Android(只是为了测试这个干净的架构)。但是在我想测试 kotlin/multiplatform 之后。 但我无法弄清楚我该如何处理用户。 我的例子是用户可以是免费增值或高级。对于免费增值,数据存储在房间数据库中,对于高级版则存储在服务器中。当然,如果您 premium/freemium,应用程序设计会发生变化。 我创建了一个 UserUseCase,我可以在其中获取用户信息。但问题是我需要这个用户用于 ui 和 db,并且所有其他用例都需要此信息,我必须每次都调用 getUser 来获取有关用户的信息。 对于域:
data class User (
var id : String = "",
var city : String = "",
var country : String = "",
var email : String = "",
var name : String = "",
var status : Int = 0
)
class UserUseCase(userRepository: IUserRepository) : IUserUseCase {
override fun getUser(): User = userRepository.getUser()
}
另一个用例:
class NoteUseCaseImpl(private val noteRepository : INoteRepository, private val userRepository : IUserRepository) : INoteUseCase{
override fun getNotes(): List<Notes> = noteRepository.getNotes(userRepository.getUser())
override fun createNote(note: Note) = noteRepository.createNote(note, userRepository.getUser())
}
然后在存储库中:
class NoteRepository(private val localNoteRepo, private val serverNoteRepo) : INoteRepository{
override fun createNote(note:Note, user : User){
if(user.status == Status.Premium)
serverNoteRepo.createNote(note)
else localNoteRepo.createNote(note)
}
} 但我需要 UI 再次执行“getUser”以了解他的状态是 Premium 还是 Freemium,因此我在各处添加了“getUser”(UseCase、viewModel 等...) 有更好的解决方案吗? 我在 Whosebug 和 google 上看到了很多例子,但我找不到好的解决方案。 如果你有任何例子...谢谢
获取用户状态和创建注释是 ui 的两个不同用例。对于第二个,您只能从域层请求用户状态。
class NoteUseCaseImpl(private val noteRepository : INoteRepository, private val userRepository : IUserRepository) : INoteUseCase{
override fun createNote(noteText: String, noteDate: Date): Note {
val user = userRepository.getUser()
val premium = user.status == Status.Premium
return noteRepository.createNote(noteText, noteDate, user.id, premium)
}
}
class NoteRepository(private val localNoteRepo, private val serverNoteRepo) : INoteRepository{
override fun createNote(noteText:String, noteDate: Date, userId: String, premium: Boolean): Note {
return if(premium)
serverNoteRepo.createNote(noteText, noteDate, userId)
else
localNoteRepo.createNote(noteText, noteDate, userId)
}
无论如何,您也应该将笔记保存在本地数据库中。所以你需要使用存储库刷新策略改进这个变体