首页新闻招聘找找看知识库
  • 回复:7 浏览:807 2014-08-21 18:01 来自 刘标才

    当删除一个实体或者修改一个实体的时候,需要判断当前实体的状态,如果状态等于0可以删除,否则是不能删除也不鞥修改的,在ddd中是怎么实现的呢?

    我目前的做法是,实体提供一个方法

    public bool CanUpdate()

    {

      return this.Status == 0;

    }

    然后在运用层删除的时候这样调用

    public void Delete(int id)

    {

      var entity = rep.FindById(id);

          if(entity == null) throw new ArgNullException("entity");

          if(!entity.CanUpdate()) throw new ServiceException("不能修改");

          rep.Remove(entity);
    }

    大家说说这样做是否合适,或者有其他建议讨论下

  • young.han
    2014-08-21 18:15 young.han
    先抢个沙发
    第1楼 回到顶楼
  • Jesse Liu
    2014-08-21 18:18 Jesse Liu
    学习。
    第2楼 回到顶楼
  • 刘标才
    2014-08-21 20:37 刘标才
    希望小组成员踊跃参与呀,怎么没人回答呢
    第3楼 回到顶楼
  • Jesse Liu
    2014-08-22 09:24 Jesse Liu
    @刘标才
    我觉得,像这样的问题DDD里面也没有比较明确的指导,我们只要抓住DDD的主要思想就可以了。 这里能符合oo思想就可以了。
    第4楼 回到顶楼
  • 田园里的蟋蟀
    2014-08-22 09:51 田园里的蟋蟀
    在DDD中,就像netfocus兄之前所说,是不存在删除的概念的,所以命名的时候要注意下,不能用delete,可以用失活表示,至于“删除"的具体实现,我觉得可以放在实体中去操作,然后在应用层中对这个实体再进行Update。
    第5楼 回到顶楼
  • 徐少侠
    2014-10-11 10:24 徐少侠
    @田园里的蟋蟀

    是不是类似这个逻辑

    void DeleteEntity(EntityKey entityKey)
    {

    Entity currentEntity = Repository.GetEntity(entityKey);
    currentEntity.DeActive();
    Repository.UpdateEntity(currentEntity);

    }

    其他的一些想法:
    判断一个领域实体是否可以被“删除",可能会涉及到对于多个其他领域实体状态的检验
    此时这种跨实体的验证逻辑,要么存在于某个实体内,要么就是独立于所有实体外

    这种逻辑,如果依然还算在领域内。则不能算是此项目的业务逻辑

    但是平时的项目,本身就没有啥底层的领域可供复用
    因此这种验证逻辑往往就存在与应用层内
    或者被集中到另一层中,但不在实体内

    此时如果把这些验证逻辑和实体放到一起算领域层方法,往往会使得应用层薄如纸
    因为,无法区分什么是领域层方法,什么是应用层方法

    应用层往往就是直接call这些领域方法了事
    不少人会吐槽这代码蛋疼, 实体也更类似贫血了
    void ApplicationDeleteEntity(EntityKey entityKey)
    {
    if(DomainEntityCanDelete(entityKey))
    {
    Entity currentEntity = Repository.GetEntity(entityKey);
    currentEntity.IsActive = false;
    Repository.UpdateEntity(currentEntity);
    }
    }
    第6楼 回到顶楼
  • 下一秒的守候
    2020-08-01 09:05 下一秒的守候
    哥哥 可以演示一下 带有dapper的方法吗?
    第7楼 回到顶楼
登录后才能评论,请先登录注册