小编Mar*_*ira的帖子

DDD:如何在 Kotlin 的集成层中隐藏特定的聚合根构造函数

我对 DDD 有点陌生,即使在阅读了蓝色和红色的书之后,我仍然对如何将一些原则转换为代码有一些疑问,特别是使用 Kotlin 和 Java。

例如,我确定接收一些参数的客户端聚合根需要它来创建名称和地址:

class Client: AggregateRoot {

    var clientId: ClienteId
    var name: Name
    var address: Address

    constructor(name: Name,address: Address) : super(){
        // validations ....
        this.name = name
        this.address = address
    }
Run Code Online (Sandbox Code Playgroud)

简单部分:为了创建一个新的客户端,我在 RS 服务中收到一个 DTO 并尝试创建一个传递上述参数的新客户端类,如果一切正常且所有规则都满足我将客户端的新实例发送到存储库,非常直接前进。

clientRepository.store(client)
Run Code Online (Sandbox Code Playgroud)

其他部分:我需要搜索我的客户端以更改地址,因此我将 id 发送到存储库并在数据库中找到客户端,然后我需要将数据库实体转换为聚合根并返回给调用者。

override fun getById(id: Long): Client {
  val clientEntity = em.find(...)
  val client: Client(.....) //But I need another constructor with ClientId
  return client
}
Run Code Online (Sandbox Code Playgroud)

然后我需要一个新的构造函数来接收更多的参数,比如 ClientId

constructor(clientId: ClienteId,name: Name,address: Address) : super(){
Run Code Online (Sandbox Code Playgroud)

问题是每个服务都可以调用这个新的构造函数并创建一个不正确的聚合根实例,所以我的问题是:

  1. 有没有办法隐藏完整的构造函数,仅供存储库或特定层查看。就像在 C# 中可以使用内部一样。
  2. Java …

java domain-driven-design kotlin

4
推荐指数
1
解决办法
459
查看次数

标签 统计

domain-driven-design ×1

java ×1

kotlin ×1