drap5081683 2015-12-14 13:43
浏览 29
已采纳

域驱动设计,实体调用存储库来验证相关资源

I'm trying to implement DDD in php. I have an entity called message that has related fromFieldId. I want to validate that this fromField exists in database when it is set on message, I do not want to burden caller with this validation as it happens in many places in my code. However from what I understand in DDD entity should not call repositories? How would I handle this in DDD?

I want something like this:

class MessageEntity{

     public function setFromFieldId($fromFieldId){
         if(!$this->fromFieldRepository->isExists($fromFieldId)){
              // throw some exception
         }
         $this->fromFieldId = $fromFieldId;
     }

 }
  • 写回答

2条回答 默认 最新

  • dougan1465 2015-12-16 09:12
    关注

    I think what you need is a DomainService in terms of DDD.

    From Eric Evans Domain-Driven Design:

    When a significant process or transformation in the domain is not a natural responsibility of an ENTITY or VALUE OBJECT, add an operation to the model as standalone interface declared as a SERVICE. Define the interface in terms of the language of the model and make sure the operation name is part of the UBIQUITOUS LANGUAGE. Make the SERVICE stateless.

    In your case, if setting a field only once is a proper concept in your ubiquitous language, then an approach could be:

    class SettingFieldOnceService
    {
        private $repository;
    
        public function __construct(Repository $repository)
        {
            $this->repository = $repository;
        }
    
        public function setFieldInEntity($field, $entity)
        {
            if ($anotherEntity = $this->repository->findByField($field)) {
                throw new DomainException("...");
        }
    
            $entity->setField($field);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。