持久化作为聚合的一部分的实体

时间:2014-08-08 07:52:31

标签: domain-driven-design cqrs event-sourcing

考虑我们有一个 BankCard 实体,它是客户端聚合的一部分。 客户可能希望取消 BankCard

class CancellBankCardCommandHandler
{
    public function Execute(CancelBankCardCommand $command)
    {
        $client = $this->_repository->get($command->clienId);
        $bankCard = $client->getBankCard($command->bankCardId);
        $bankCard->clientCancelsBankCard();

        $this->_repository->add($client);
    }
}

class BankCard implements Entity
{    
    // constructor and some other methods ...

    public function clientCancelsBankCard()
    {
        $this->apply(new BankCardWasCancelled($this->id);
    }
}

class Client implements AggregateRoot
{
    protected $_bankCards;

    public function getBankCard($bankCardId)
    {
       if (!array_key_exists($bankCardId, $this->_bankCards) {
           throw new DomainException('Bank card is not found!');
       }

       return $this->_bankCard[$bankCardId]);
    }        
}

最后,我们有一些域存储库实例,它可以存储聚合。

class ClientRepository implements DomainRepository
{
     // methods omitted

     public function add($clientAggregate)
     {
         // here we somehow need to store BankCardWasCancelled event
         // which is a part of BankCard Entity     
     } 
}

我的问题是AggregateRoot是否负责跟踪其实体的事件。是否有可能从其Aggregate中获取作为Aggregate一部分的Entity的事件?

如何实际保留客户对银行卡所做的所有更改,以保持其一致性?

1 个答案:

答案 0 :(得分:0)

我想说整个聚合负责跟踪发生的变化。在机械方面,这可能是“分布式”#34;聚合根实体和聚合中的任何其他实体或聚合根实体之间作为唯一的记录器或一些外部工作单元。你的选择,真的。不要太熟悉机制。不同的语言/范例,实现所有这些的不同方式。如果某个子实体发生了某些事情,只需将其视为聚合的一部分并进行相应的记录。