php - 服务层和模型与领域驱动设计的关联

我正在设计 Web 应用程序的基础架构。该项目遵循领域驱动设计方法,因为业务模型和逻辑非常复杂。

该项目还旨在成为一个SOA 项目(面向服务的架构)。因此,我学到了很多关于服务以及如何围绕它构建项目的知识。

关注 previous question of mine ,我有一个关于模型类中的关联的问题。

我明白模型类不应该知道也不应该做任何与持久性相关的事情。但是,我无法决定模型类之间关联的情况。

例如:

  • class Car 有一个司机(例如)

getDrivergetCars 应该在哪里?

  1. 在模型类中:$car->getDriver()
  2. 在具有原始类型的服务层中:$personService->getPerson($car->getDriverId())
  3. 在服务层使用 OOP:$carService->getDriver($car)

解决方案 1. 似乎更自然。我使用的是 Doctrine 2,因此模型关联是通过 DB 映射注释处理的。这样,该模型不会做任何与持久性相关的事情(即使它实际上通过 Doctrine )。这是我最喜欢的解决方案,但是除了加载“汽车”列表作为开始之外,该服务还有什么意义呢?

解决方案 2. 似乎很愚蠢,因为它抛弃了 OOP,模型/服务用户必须知道数据库模型才能获取关联(他必须知道这个 ID 是一个“人”ID)。而且他必须自己做协会。

解决方案 3. 比解决方案 2 好一点,但仍然OOP 在哪里

所以,对我来说解决方案 1. 是最好的。但是我看到方案二和方案三在实际项目中使用过(有时混合在一起),所以我有疑问。

当有额外的参数时,问题会变得更复杂,例如:

$person->getCars($nameFilter, $maxNumberOfResults, $offset);

(在这种情况下,它看起来真的很像 SQL 查询/持久化查询)

那么,在遵循领域驱动设计方法的项目中,应该将哪一个用于模型/服务架构?使用 SOA,我的模型是否应该只是没有逻辑的“哑”数据容器?如果是这样,那么 DDD 方法在哪里?

最佳答案

在 DDD 的上下文中,这是一个决定实体之间的关系是通过直接对象关联还是存储库来表达的问题。这两种方法都可能有效,并且取决于关系的性质。例如,在您的域中,一个人可能有很多与之相关联的汽车,而从个人实体直接关联到汽车集并没有实际意义。请记住,实体(或更具体地说是聚合根)的工作是保护不变量并执行业务规则。如果 person 类中存在的任何行为都不需要与一个人关联的汽车集,那么就没有理由将关联放在 person 实体上。此外,如您的示例所示,可能需要过滤对汽车的查询。为了回答你的问题,我会把代表人车关系的责任放在 repository 中。 . SOA 与 DDD 正交,更侧重于如何访问和部署业务功能。从 hexagonal architecture 的角度考虑 DDD 和 SOA 之间的相互作用是有益的也称为 onion architecture .您的域处于核心位置,由一组应用程序服务封装,这些应用程序服务在您的域周围形成 API 外观。这些不同于 SOA 中的服务,它们是六边形/洋葱架构中的端口/适配器,它们用于将这些应用程序服务公开为 SOA 服务。

https://stackoverflow.com/questions/11249373/

相关文章:

hibernate - JPA/JPQL : AS identifier disallowed in

regex - 基于预定义文本字符串的复杂正则表达式来阻止色情

ruby-on-rails - 将 Rails 应用程序连接到 Microsoft Access

python - 使用 python 需求文件,您可以控制安装包依赖项的顺序吗?

xml - 有没有比 <!ENTITY> 更好的方法来重用 DocBook 中的复杂表格?

python - 如何在 python smtplib 模块中设置主机地址?

python - 在 PyGame (SDL) 中使用 Cairo 时的字节顺序

c# - 当本地服务帐户在服务中运行时,并非有关 Process.GetProcesses 中进程的

wix - 如何在不调用安装的情况下执行 MSI 中存在的自定义操作?

arrays - 确定网格上的点是否为 "trapped"(封闭)