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实现)对域对象有着非常深入的了解,否则它将无法将它们水合。您应该担心的是一个反向——“数据访问泄漏到域中”,而这在上面的代码中并没有发生。有些人可能会说存储库是域模型的一部分(至少是它的接口)。如何将删除(这是一个糟糕的术语,因为这几乎不是任何人所说的)传达给持久性存储取决于您。