值对象和外部库


Value Object and External libraries

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

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

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

我几乎可以肯定,handle Money和我们使用哪个库的决定不应该影响到我们的Domain,只是因为这是一个实现问题。

  1. 我们可以在我们的域下使用外部库吗?
  2. 我们可以为ValueObject定义一个接口吗?
  3. 我们应该把钱放在我们的域名下吗?它不是一个会计软件,它只是一个我们需要使用的原始类型,但对我们来说并不重要。我们为什么要留在域下?
什么是最好的方法来保持我们的域名清晰,但解决这个问题?
  1. 是的,只要他们不直接做I/O的东西(文件系统/网络/数据库访问),不引用基础设施或I/O相关的库。

  2. 是的,这正是值对象的作用。电子商务领域与邮件递送无关,但CustomerAddress在那里是一个完全有效的VO。

根据你的领域,金钱可能在领域层,但在不同的边界上下文中,专门处理支付。但并非总是如此

回答你的问题:

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

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