我正在设计Web应用程序的基础体系结构。该项目遵循Domain-Driven Design方法,因为业务模型和逻辑非常复杂。服务层和模型与域驱动设计的关联
该项目还旨在成为一个SOA项目(面向服务的体系结构)。所以我正在学习很多关于服务以及如何围绕它来构建项目。
在previous question of mine之后,我有一个关于模型类中的关联的问题。
我明白,模型类不应该知道和做任何有关持久性。然而,我很难决定模型类之间的关联。
例如:
- 类
Person
- 类
Car
有(为例子)
一个驱动程序getDriver
和getCars
应放在何处?
- 在模型类:
$car->getDriver()
与原始类型服务层
- :在服务层
$personService->getPerson($car->getDriverId())
- 使用OOP:
$carService->getDriver($car)
溶液1似乎更自然。我正在使用Doctrine 2,因此模型关联会使用数据库映射注释处理。这样,模型不会做任何与持久性相关的事情(尽管实际上通过Doctrine来做)。这是我最喜欢的解决方案,但除了加载“汽车”列表之外,本服务的重点是什么?因为它扔掉OOP和型号/服务的用户必须知道有关数据库模型获取协会(他已经知道这ID是一个“人”的ID)
解决方案2.似乎只是愚蠢。他必须亲自去做这个协会。
解决方案3比解决方案2好一点,但仍然是其中OOP在那?
所以,对我来说解决方案1.是最好的。但我已经看到了解决方案2和解决方案3在实际项目中使用(有时混合在一起),所以我有疑问。
而且,问题就变成当有额外的参数比较复杂,例如:
$person->getCars($nameFilter, $maxNumberOfResults, $offset);
(在这种情况下,它确实看起来像一个SQL查询/持久查询)
那么,哪一个应该用于模型/服务体系结构上的项目跟在域驱动设计的方法?有了SOA,我的模型应该只是没有逻辑的“哑”数据容器吗?如果是这样,那么DDD方法在哪里?
确定首先我明白我混合了SOA和应用程序服务。实际上,所有关于关联的问题都依赖于一个实体是否是一个聚合根。如果是,我应该使用存储库。如果它是一个聚合的子实体,那么我应该使用对象关联。我对么? –