清洁架构和用户

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)
}

无论如何,您也应该将笔记保存在本地数据库中。所以你需要使用存储库刷新策略改进这个变体