PJH*_*PJH 5 android entity kotlin clean-architecture android-room
我的问题如标题所示。
Room 有注释@Entity,在 Room 中,这被视为Entity.
但在 Clean 架构中,当使用 Domain 层时,Entity也会使用 an。
例如,领域层内的用例使用的实体。
然而,我认为 Room 认为的Entity是 Clean 架构的 aDTO或POJOas。
话虽如此,在创建应用程序时,我应该在表示层、领域层和数据层中为我的模型命名什么?
领域层:
Domain layer是干净架构的中心点,它不仅包含领域层data models,而且usecases领域层应该是语言特定的东西,这意味着不应该有第三方参与,你必须将其保持在语言范围内。域层是您将在整个应用程序中管理的东西,即使在单元测试中(大多数时候)也是如此。
框架层:
当您说Entity或DTO我们与 Room 或 Retrofit 一起使用以及我们与第三方库一起使用的这些框架时,这些应该属于framework layer架构。这意味着这些实体和 dto 并不直接针对用例或领域模型,但我们如何使用它们或将它们与领域模型连接起来?这就是映射器发挥作用的地方,您必须使用映射器机制将数据从一层映射到另一层,并且不违反 CA 规则。
示例:
实体:
@Entity(tableName = "user_auth")
data class UserAuthEntity(
@PrimaryKey(autoGenerate = false)
@ColumnInfo(name = "pk")
val uid: String,
@ColumnInfo(name = "user_name")
val username: String,
@ColumnInfo(name = "email")
val email: String,
@ColumnInfo(name = "password")
val password: String,
)
Run Code Online (Sandbox Code Playgroud)
域模型:
data class UserAuth(
val uid: String,
val username: String,
val email: String,
val password: String,
)
Run Code Online (Sandbox Code Playgroud)
我们将使用 kotlin 扩展函数来映射它们:
fun UserAuth.fromDomain(): UserAuthEntity{
return UserAuthEntity(
uid, username, email, password
)
}
fun UserAuthEntity.toDomain(): UserAuth{
return UserAuth(uid, username, email, password)
}
Run Code Online (Sandbox Code Playgroud)
如何使用它:
suspend fun getUser(): UserAuth {
// this userAuth is from dao which Entity
val userAuth = dao.getUserEntity()
// map them userAuth domain through mapper extension functions
return userAuth.toDomain()
}
Run Code Online (Sandbox Code Playgroud)
fromDomain意味着我们从域获取数据并映射到实体,toDomain我们正在从实体获取数据并映射到域。
作为旁注,正如上面提到的,我们将使用映射器在层之间映射数据。由于基于layer此的干净架构并不意味着我们总是在各处使用映射器来分离层和层之间的通信,因为这个问题是关于数据模型的,所以我们通常使用映射器来映射其中的数据,而不破坏层。
请搜索一下DIP(依赖反转原理),我们如何通过接口在不同层之间进行通信。