【问题标题】:DDD, problem with value objects and "new Domain()"DDD,值对象和“新域()”的问题
【发布时间】:2022-01-22 09:10:13
【问题描述】:

我有一个问题,

我正在一个 laravel 项目中从 MVC 迁移到六边形架构和 DDD 架构。

我知道值对象代表表 X 的一个属性,但我有一个问题,我有一个有 60 列的表,它会有 60 个值对象吗? laravel 控制器中的同一张表有 20 个单独的表的连接,这 20 个表的列也是值对象?

还有一个问题,比如我通过id查询同一张表的记录,当我得到结果,我必须创建模型时,我应该实例化这60个值对象吗?

例子

$users = $this->user->find($id);

$user = new User(
    new UserId($users->id),
    value object 2,
    value object 3.... to 60 value objects
);

【问题讨论】:

  • 您是如何得出一个 DDD 值对象代表数据库表中的一列的结论的?
  • 我得出的结论是,当某些列具有行为和验证时,我将它们转换为值对象,并在创建模型时,例如用户模型,$user = new User(value对象 1,值对象 2,.....)我自动分配贵重物品,因此我不必添加 30 或 40 个值对象

标签: php laravel domain-driven-design value-objects hexagonal-architecture


【解决方案1】:

我会说整个连接表通常是一个值对象。例如,值对象是包含街道/城镇/国家等的地址。

当然,您总是可以将每一列描述为一个单独的类,但在我看来,这是一种过度设计,如果您不期望该值(值对象类中的方法)有任何特殊的域行为,那就是浪费时间。

您还应该考虑这 20 个表是否必须成为您的实体的一部分。我通常在一个实体表中使用关系+与该特定实体相关的一些表,并且我不与其他实体共享这些相关表。我不会在不同实体的上下文之间创建引用。也许你有一组实体,你需要一组它们的存储库/工厂。如果有两个存储库,则不应在 SQL 级别加入它们。

我知道每种情况都不同,但您应该始终尝试编写小段代码。小类、实体、有界上下文、模块、服务……通常更容易处理。

【讨论】:

    【解决方案2】:

    DDD 中的值对象不一定是表的列。

    值对象是您域的对象,不可变,可能具有多个属性,没有标识,如果所有属性都相等,则两个值对象相等。

    它可以映射到数据库表的一列,也可以映射不止一列。这是一个基础设施问题。

    【讨论】:

      猜你喜欢
      • 2010-10-31
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多