值对象和外部库

Value Object and External libraries

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

我们正在编写我们的域层,在很多情况下,我们需要一个类型,例如货币,它不属于我们的域,它不仅仅是一个实体的类型,它不存在于语言 (PHP).

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

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

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

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

回答您的问题:

  1. 是的,你可以。但是你必须明白,这个图书馆成为你领域的一部分。因此它必须适合您的特定领域(例如,如果库有 100500 classes 而您只需要其中一个 - 在库中使用是不好的)。共同点——你可以做到。
  2. 我不认为,这对值对象来说是个好主意。如果你需要为它创建一个接口,这意味着它不适合你。对于这样一个简单的对象,Ir 看起来像是过度架构。
  3. 它真的是域对象吗?也许它只是简单的 "well-known" class 就像 intstring。你可以把它放在一些 infrastructure 层。因此,您系统的每个部分都可以使用它。我们在我们的项目中这样做。我们在一个 model.infrastructure 库中移动了一些 "all-application" classes 和 "never change" 类型,这减少了层之间的映射和转换。

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

  1. 是的,只要他们不直接做 I/O 事情(filesystem/network/database 访问)并且不引用基础设施或 I/O 相关库。

  2. 是的,但是为什么?

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

不过,您可能会发现,根据您的域,Money 可能位于域层中,但位于专门处理付款的不同 Bounded Context 层中。但并非总是如此。