【问题标题】:Value Object and External libraries值对象和外部库
【发布时间】:2015-10-02 15:33:55
【问题描述】:

我们正在使用 DDD 构建我们的应用程序。

我们正在编写域层,在许多情况下,我们需要一个类型,例如 Money,它不是我们域的一部分,它不仅仅是语言中不存在的实体类型( PHP)。

我们不想浪费时间来创建和重新创建已经存在的库。

我几乎可以肯定,处理 Money 和我们使用哪个库的决定不应该影响我们的域,因为这是一个实施问题。

  1. 我们可以在我们的域下使用外部库吗?
  2. 我们可以为 ValueObject 定义一个接口吗?
  3. 我们应该把钱放在我们的域下吗?它不是会计软件,它只是我们需要使用的原始类型,但对我们来说并不重要。为什么要保留在 Domain 下?

保持我们的域清晰但解决此问题的最佳方法是什么?

【问题讨论】:

    标签: php domain-driven-design


    【解决方案1】:
    1. 可以,只要它们不直接执行 I/O 操作(文件系统/网络/数据库访问)并且不引用基础架构或 I/O 相关库。

    2. 是的,但为什么?

    3. 是的,这正是值对象的用途。电子商务域与邮件传递无关,但 CustomerAddress 是一个完全有效的 VO。

    您可能会遇到的问题是,根据您的域,Money 可能位于域层中,但位于专门处理付款的不同 Bounded Context 中。但情况并非总是如此。

    【讨论】:

      【解决方案2】:

      回答你的问题:

      1. 是的,你可以。但是你必须明白,这个库成为你领域的一部分。所以它必须适合您的特定领域(例如,如果库有 100500 个类,而您只需要其中一个类 - 使用 while 库并不好)。共同点 - 你可以做到。
      2. 我不认为,这对于价值对象来说是个好主意。如果你需要为它创建一个界面,这意味着它不适合你。对于这样简单的对象,Ir 看起来像和过度架构。
      3. 真的是领域对象吗?也许它只是简单的“知名”类,如intstring。你可以把它放在一些infrastructure 层。因此,系统的每个部分都可以使用它。我们在我们的项目中这样做。我们将一些“永不改变”的“全应用”类和类型移到一个 model.infrastructure 库中,这减少了层之间的映射和转换。

      但要小心,这个答案与 DDD 问题的答案一样多,因为我不知道你所有的应用程序逻辑。

      【讨论】:

      • 我从你的 3. 回答开始。我觉得 Money 不是我们领域中的 ValueObject。它不是一个会计软件,我们只是想以一种“好的方式”简单地处理金钱,并享受这个库可以带来的附加功能。例如:substractaddequals 等... 问题:如果我把它放在基础设施下,我的实体如何保存这个Money 类型的原语?我认为在这一层是未知的,这就是为什么我正在考虑为这个 VO 创建一个接口,该接口具有稍后基础设施层所需的基本功能......
      • @fureszpeter 我看到了三个解决方案:在你的域中包含这个库,创建共享库(可以被域层使用)并创建域接口和实现。我不了解php的所有特性,所以你需要比较一下哪种方式是开发复杂性和层分离与使用DDD之间的一个很好的折衷(DDD总是一种折衷,很难构建纯粹的DDD应用程序)跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多