如果我的域模型不应该知道/关心存储库,那么封装CRUD-Update的一些行为如.UpdateOrder(...)
如何与存储库接口?通过域名服务?
好的,那么我的存储库有一个有效的CRUD-Update,它与我的.UpdateOrder(...)
一起使用。没关系。但我不希望有人在Repository上使用Update方法,我希望他们通过实体上的行为(改为使用UpdateOrder())。我更喜欢我的域模型满足不变量的方式 - 通过它的设计(私有集属性等) - 我的存储库不公开了另一种方法来“更新”/持久化实体。
这只是一个访问修饰符问题,我在Repo public中没有使用Update方法解决了这个问题。还是有一个“更好”的答案?请帮我DDD忍者。
答案 0 :(得分:3)
DDD中的严格序列是:
var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);
存储库始终负责检测/持久保存实体中的所有更改。
(顺便说一下,我假设你的实体是一个聚合根)
答案 1 :(得分:2)
如果您的域模型不包含持久性,那么它不包括存储内容的操作。如果您的实体来自域模型,那么它就没有业务持续存在。
你说:
没关系。但我不想要某人 使用Update方法 存储库,我希望它们通过 实体上的行为
但我认为这是错误的。您的域对象不再需要自己保持打印,而不是自己打印,在屏幕上绘图等等。您的域类不应该使用UpdateOrder方法。
现在,您可能不希望将原始存储库(从持久性实现层)公开给其他代码,但这只是意味着将其包装在合适的位置。听起来你有代码需要谈论持久性,所以要弄清楚它需要处理什么级别的话语,并为它提供合适的接口。