我正在尝试在具有大量业务逻辑的项目中有效地使用 DDD 和 Doctrine2 。
这对我来说很新,我正在阅读许多文章和代码示例,以了解DDD的主要原则和实践。
我理解我们需要将域对象与其他与系统相关的概念解耦, 即在分层架构中,“域层”必须与其他层隔离,例如持久层/服务(Doctrine2 for me)。
但有一两件事,很难理解我:在与doctrine2国内长途,域实体的聚集与学说的ArrayCollection 管理,我发现这样的几个代码示例代码:
namespace Acme\Domain\Model\Users;
use Doctrine\Common\Collections\ArrayCollection;
class User{
//...
/**
* Collection of Roles
*
* @var Collection of Roles
*/
protected $roles;
/**
* Constructor.
*/
public function __construct()
{
$this->createdAt = new \DateTime();
$this->roles = new ArrayCollection();
}
public function getRoles()
{
return $this->roles;
}
//...
}
对我来说,这个实现在域模型和持久性服务,Doctrine2之间创建了一个高耦合。
另一方面,如果DDD实体和Doctrine实体类是分离的,我认为有很多层/类。 你怎么看 ?有没有更好的方法来避免/处理这个?
答案 0 :(得分:4)
不要对使用ArrayCollections感到惊慌。请注意,它位于Doctrine / Common命名空间中。它只是一个小实用程序数组包装器,与Doctrine持久层没有特别的联系。您可以轻松地将其替换为另一个数组类。
本手册解决了这个问题:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#collections。向下滚动到:5.12。集合
就解耦而言,可以进行DDD建模,同时将自己局限于学说实体。这是非常有限的,通常是气馁的。所以,你可能需要另一层。
很难证明php中纯DDD实现的开销。