通过域封装的持久性,还是通过存储库的持久性?

时间:2010-12-02 15:46:20

标签: domain-driven-design entity separation-of-concerns ddd-repositories domainservices

如果我的域模型不应该知道/关心存储库,那么封装CRUD-Update的一些行为如.UpdateOrder(...)如何与存储库接口?通过域名服务?

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

这只是一个访问修饰符问题,我在Repo public中没有使用Update方法解决了这个问题。还是有一个“更好”的答案?请帮我DDD忍者。

2 个答案:

答案 0 :(得分:3)

DDD中的严格序列是:

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

存储库始终负责检测/持久保存实体中的所有更改。

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

答案 1 :(得分:2)

如果您的域模型不包含持久性,那么它不包括存储内容的操作。如果您的实体来自域模型,那么它就没有业务持续存在。

你说:

  

没关系。但我不想要某人   使用Update方法   存储库,我希望它们通过   实体上的行为

但我认为这是错误的。您的域对象不再需要自己保持打印,而不是自己打印,在屏幕上绘图等等。您的域类不应该使用UpdateOrder方法。

现在,您可能不希望将原始存储库(从持久性实现层)公开给其他代码,但这只是意味着将其包装在合适的位置。听起来你有代码需要谈论持久性,所以要弄清楚它需要处理什么级别的话语,并为它提供合适的接口。