【问题标题】:Dao in Usecase. MVVM or Clean Architecture anti-pattern?用例中的道。 MVVM 或 Clean Architecture 反模式?
【发布时间】:2021-01-24 17:18:39
【问题描述】:

在我们的“SearchUsecase”中,我们可以直接访问“ShowFtsDao”。

它是否违反了清洁架构原则?是否违反 MVVM 架构?

假设我们的意图是开发一个构建良好的标准结构,那么这段代码有什么问题吗?

class SearchUsecase @Inject constructor(
    private val searchRepository: SearchRepository,
    private val showFtsDao: ShowFtsDao,
    private val dispatchers: AppCoroutineDispatchers
) : SuspendingWorkInteractor<SearchShows.Params, List<ShowDetailed>>() {
    override suspend fun doWork(params: Params): List<ShowDetailed> {
        return withContext(dispatchers.io) {
            val remoteResults = searchRepository.search(params.query)
            if (remoteResults.isNotEmpty()) {
                remoteResults
            } else {
                when {
                    params.query.isNotBlank() -> showFtsDao.search("*$params.query*")
                    else -> emptyList()
                }
            }
        }
    }

    data class Params(val query: String)
}

【问题讨论】:

    标签: android mvvm clean-architecture anti-patterns


    【解决方案1】:

    我相信您的用例处理的逻辑比它需要的要多。 作为一个简单的解释,我喜欢这样考虑组件:

    • Sources:RemoteSource(网络)、LocalSource (db),可选 MemorySource 是对您的数据库和网络 API 的抽象,它们执行 IO 线程切换和数据映射(这在大型项目中派上用场,其中后端并非完全由移动设备驱动)
    • 存储库:与来源沟通,他负责决定您从哪里获取数据。我相信在您的情况下,如果 RemoteSource 返回空数据,那么您可以从 LocalSource 获取它。 (当然,您可以公开不同的方法,例如 get()fetch(),其中消费者指定是否需要最新数据,并基于该存储库调用正确的源。
    • 用例:与多个存储库对话并合并它们的数据。

    【讨论】:

      【解决方案2】:

      是的,确实如此。

      因为您的domain 模块可以访问data 模块,而实际上您违反了依赖规则

      该规则指定在外圈中声明的内容必须 内圈没有在代码中提及。

      Domain 层必须包含在data 层中实现的细节接口(存储库),

      然后,可以将它们注入UseCases (DIP)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-03
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2020-06-18
        • 2021-12-05
        相关资源
        最近更新 更多