Room Entity 和 Clean architecture Domain 层的 Entity 是不同的吗?
Is Room Entity and Clean architecture Domain layer's Entity is different?
我的问题如标题所述。
房间有注释 @Entity
,在房间内,这被认为是 Entity
。
但是在干净的架构中,当使用域层时,
还使用了 Entity
。
例如,域层中用例使用的实体。
但是,我认为 Room 认为 Entity
是 DTO
或 POJO
作为 Clean 架构。
话虽如此,在创建应用程序时,我应该在表示层、领域层和数据层中为我的模型命名什么?
领域层:
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,
)
领域模型:
data class UserAuth(
val uid: String,
val username: String,
val email: String,
val password: String,
)
我们将使用 kotlin 扩展函数来映射它们:
fun UserAuth.fromDomain(): UserAuthEntity{
return UserAuthEntity(
uid, username, email, password
)
}
fun UserAuthEntity.toDomain(): UserAuth{
return UserAuth(uid, username, email, password)
}
使用方法:
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()
}
fromDomain
表示我们从域获取数据并映射到实体,toDomain
我们从实体获取数据并映射到域。
作为旁注,如上所述,我们将使用映射器在层之间映射数据。由于基于 layer
的干净架构并不意味着我们总是要在任何地方使用映射器来分离层和层之间的通信,因为这个问题是关于数据模型的,我们通常使用映射器来映射位于它通过不破坏层。
请搜索DIP(依赖倒置原则),我们如何通过接口在不同层之间进行通信。
我的问题如标题所述。
房间有注释 @Entity
,在房间内,这被认为是 Entity
。
但是在干净的架构中,当使用域层时,
还使用了 Entity
。
例如,域层中用例使用的实体。
但是,我认为 Room 认为 Entity
是 DTO
或 POJO
作为 Clean 架构。
话虽如此,在创建应用程序时,我应该在表示层、领域层和数据层中为我的模型命名什么?
领域层:
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,
)
领域模型:
data class UserAuth(
val uid: String,
val username: String,
val email: String,
val password: String,
)
我们将使用 kotlin 扩展函数来映射它们:
fun UserAuth.fromDomain(): UserAuthEntity{
return UserAuthEntity(
uid, username, email, password
)
}
fun UserAuthEntity.toDomain(): UserAuth{
return UserAuth(uid, username, email, password)
}
使用方法:
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()
}
fromDomain
表示我们从域获取数据并映射到实体,toDomain
我们从实体获取数据并映射到域。
作为旁注,如上所述,我们将使用映射器在层之间映射数据。由于基于 layer
的干净架构并不意味着我们总是要在任何地方使用映射器来分离层和层之间的通信,因为这个问题是关于数据模型的,我们通常使用映射器来映射位于它通过不破坏层。
请搜索DIP(依赖倒置原则),我们如何通过接口在不同层之间进行通信。