DDD,Doctrine2,Aggregates和ArrayCollection:如何隔离域模型?

时间:2013-08-27 08:14:39

标签: doctrine-orm domain-driven-design domain-model

我正在尝试在具有大量业务逻辑的项目中有效地使用 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实体类是分离的,我认为有很多层/类。 你怎么看 ?有没有更好的方法来避免/处理这个?

1 个答案:

答案 0 :(得分:4)

不要对使用ArrayCollections感到惊慌。请注意,它位于Doctrine / Common命名空间中。它只是一个小实用程序数组包装器,与Doctrine持久层没有特别的联系。您可以轻松地将其替换为另一个数组类。

本手册解决了这个问题:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#collections。向下滚动到:5.12。集合

就解耦而言,可以进行DDD建模,同时将自己局限于学说实体。这是非常有限的,通常是气馁的。所以,你可能需要另一层。

很难证明php中纯DDD实现的开销。