我正在设计 Web 应用程序的基础架构。该项目遵循领域驱动设计方法,因为业务模型和逻辑非常复杂。
该项目还旨在成为一个SOA项目(面向服务的架构)。所以我学到了很多关于服务以及如何围绕它构建项目的知识。
在我的上一个问题之后,我有一个关于模型类中的关联的问题。
我知道模型类不应该知道和做任何与持久性相关的事情。但是,我很难确定模型类之间的关联情况。
例如:
- 班级
Person
- 类
Car
有一个驱动程序(例如)
getDriver
和应该在哪里getCars
?
- 在模型类中:
$car->getDriver()
- 在具有原始类型的服务层中:
$personService->getPerson($car->getDriverId())
- 在使用 OOP 的服务层中:
$carService->getDriver($car)
解决方案1.似乎更自然。我正在使用 Doctrine 2,因此模型关联是使用 DB 映射注释处理的。这样,模型就不会做任何与持久性相关的事情(即使它实际上是通过 Doctrine 做的)。这是我最喜欢的解决方案,但是除了加载“汽车”列表之外,服务还有什么意义呢?
解决方案 2. 似乎很愚蠢,因为它抛弃了 OOP 并且模型/服务用户必须知道数据库模型才能获取关联(他必须知道此 ID 是“人员”ID)。而且他必须自己做关联。
解决方案 3. 比解决方案 2 好一点,但其中的 OOP 仍然在哪里?
所以,对我来说,解决方案 1. 是最好的。但是我在实际项目中看到了解决方案 2. 和解决方案 3. (有时混合在一起),所以我有疑问。
当有附加参数时,问题变得更加复杂,例如:
$person->getCars($nameFilter, $maxNumberOfResults, $offset);
(在这种情况下,它真的看起来像一个 SQL 查询/持久性查询)
那么,在遵循领域驱动设计方法的项目中,应该将哪一个用于模型/服务架构?使用 SOA,我的模型应该只是没有逻辑的“哑”数据容器吗?如果是这样,那么 DDD 方法在哪里?