Domain driven design 更新、删除域模型

Domain driven design 更新、删除域模型,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,我用春天,冬眠为我的生命。对于更新,我调用repo.findById(id)获取当前实例,然后调用model.setXXX()更新字段,最后调用repo.save(mdl)将其保存回来。对于删除,我调用repo.remove(id),现在我的更新和删除都是状态驱动的,可能会导致我的模型发生状态更改,有时,根据状态,某些操作(如删除)是不允许的。我如何实现这些行为,以使这些逻辑基本上在域模型中,并且不会泄漏到存储库实现中?我会这样做: // entity class User{ ... b

我用春天,冬眠为我的生命。对于更新,我调用
repo.findById(id)
获取当前实例,然后调用
model.setXXX()
更新字段,最后调用
repo.save(mdl)
将其保存回来。对于删除,我调用
repo.remove(id)
,现在我的更新和删除都是状态驱动的,可能会导致我的模型发生状态更改,有时,根据状态,某些操作(如删除)是不允许的。我如何实现这些行为,以使这些逻辑基本上在域模型中,并且不会泄漏到存储库实现中?

我会这样做:

// entity
class User{
  ...
  bool CanBeArchived(){
    // check whether objects can be archived based
    // on the rules and state that you mention
  } 
  ...
}

// repository
interface UserArchiver{
  // implementation calls 'CanBeArchived' and throws if it fails
  void Archive(User user)
}
您似乎不喜欢上述方法,因为

。。。逻辑基本上在域模型中,不会泄漏到 存储库实现


我认为您不应该担心域泄漏到存储库实现中。无论如何,这是不可避免的,数据访问层(repo实现)对域对象有着非常深入的了解,否则它将无法将它们水合。您应该担心的是一个反向——“数据访问泄漏到域中”,而这在上面的代码中并没有发生。

有些人可能会说存储库是域模型的一部分(至少是它的接口)。如何将删除(这是一个糟糕的术语,因为这几乎不是任何人所说的)传达给持久性存储取决于您。