You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Clean Architecture:领域层向数据层传数据的解决方案探讨

解决Clean Architecture中Domain与Data层的数据传递问题

这是Clean Architecture里非常典型的边界隔离问题,用Any确实能绕开类型检查,但完全违背了架构设计的初衷——失去了类型安全,后期维护会踩很多坑。下面是行业内的标准解决方案:

核心思路:Domain层定义领域模型,Data层负责模型转换

Clean Architecture的核心就是让Domain层完全独立,不依赖任何外部层(包括Data层)。所以正确的做法是:

  • Domain层维护自己的领域数据模型(也就是你代码里的Data类)
  • Data层在接收Domain层的数据后,自行转换为内部使用的DataEntity
  • Repository接口定义在Domain层,Data层实现该接口时完成转换逻辑

代码示例

Domain层(保持独立,无外部依赖)

// Domain层的领域模型
data class Data(val content: String, val timestamp: Long)

// Domain层定义Repository接口
interface Repository {
    fun sendData(data: Data): Observable<Response>
}

// Interactor调用Domain层的Repository接口
class SendDataInteractor(val repository: Repository, val data: Data) : ObservableUseCase<Response>() {
    override fun buildObservableUseCase(): Observable<Response> {
        return repository.sendData(data) // 这里只知道Domain的Data,完全不知道DataEntity
    }
}

Data层(实现转换逻辑,依赖Domain层)

// Data层内部的实体类
data class DataEntity(val payload: String, val time: Long)

// Data层实现Domain的Repository接口
class RemoteRepositoryImpl : Repository {
    override fun sendData(data: Data): Observable<Response> {
        // 把Domain模型转换为Data层的DataEntity
        val dataEntity = DataEntity(
            payload = data.content,
            time = data.timestamp
        )
        // 调用你原本的sendData方法
        return actualSendData(dataEntity)
    }
    
    // 你原来的Data层方法
    private fun actualSendData(data: DataEntity): Observable<Response> {
        // 这里处理实际的网络/本地存储逻辑
    }
}

优化:用映射库减少手动转换代码

如果Domain模型和DataEntity的字段映射逻辑很繁琐,可以用映射库来简化:

  • Kotlin可以用kotlinx.serialization或者自定义扩展函数
  • Java可以用MapStruct、ModelMapper这类库

比如用Kotlin扩展函数实现转换:

// Data层的扩展函数
fun Data.toDataEntity(): DataEntity {
    return DataEntity(
        payload = this.content,
        time = this.timestamp
    )
}

// 调用时就更简洁
override fun sendData(data: Data): Observable<Response> {
    return actualSendData(data.toDataEntity())
}

为什么不推荐用Any?

用Any作为参数类型会带来以下问题:

  • 失去类型安全:编译期无法检查传入的数据是否符合要求,运行时容易出现类型转换异常
  • 破坏架构边界:Domain层虽然没有直接依赖Data层,但通过Any模糊了边界,后期修改DataEntity时,Domain层的代码可能会隐性出错
  • 降低代码可读性:其他开发者看到Any参数时,无法直观知道需要传递什么类型的数据

内容的提问来源于stack exchange,提问作者SWR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:12:56