1

如果我的领域模型不应该知道/关心存储库,那么像.UpdateOrder(...)这样的一些行为如何封装一个CRUD-Update与存储库的接口?通过域名服务?通过域封装的持久性,还是通过Repository持久化?

好的,那么我的Repository有一个有效的CRUD更新,与我的.UpdateOrder(...)一起使用。没关系。但我不希望有人在存储库上使用Update方法,我希望他们通过实体上的行为(使用UpdateOrder()代替)。我更喜欢像我的领域模型满足不变式的方式 - 通过它的设计(私有属性等) - 我的知识库而不是公开了一种替代方法来“更新”/坚持实体。

这是一个简单的访问修饰符问题,由我在Repo public中没有Update方法解决。或者有更好的答案?请帮我DDD忍者。

+0

UpdateOrder做了什么,它需要什么样的参数?它实际上是用实体中的值更新持久存储吗? – 2010-12-02 16:53:10

+0

UpdateOrder是业务模型的行为。除了封装域逻辑和最后它需要保持更改的状态之外,它并不重要。 – 2010-12-03 13:15:07

回答

3

在DDD的严格序列将是:

var entityRepository = MyServiceLocator.Get<IEntityRepository>(); 
var myEntity = entityRepository.Load(<some criteria>); 
myEntity.Change(something); 
entityRepository.Save(myEntity); 

存储库是总是负责检测/坚持所有的实体内的变化。

(顺便说一句,我假设你的实体是一个聚合根)

2

如果您的域模型不包括持久性,那么它不包括存储东西的操作。如果你的实体是来自领域模型的东西,那么它就没有业务坚持自己。

你说:

这很好。但我不希望有人 使用Update方法上 库,我希望他们去通过 行为的实体

但我认为这是错误的。你的域对象没有更多的责任来坚持自己比自己打印自己,在屏幕上自己画自己,等等。你的域名类不应该有一个UpdateOrder方法

现在,您可能不想将原始资源库(从您的持久化实现层)暴露给其他代码,但这仅仅意味着将其包装在合适的东西中。这听起来像你有需要讨论持久性的代码,所以要弄清楚它需要处理什么级别的话语,并向其展示合适的接口。