首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >持久化通过域封装,还是通过存储库持久化?

持久化通过域封装,还是通过存储库持久化?
EN

Stack Overflow用户
提问于 2010-12-02 15:46:20
回答 2查看 358关注 0票数 1

如果我的领域模型不应该知道/关心存储库,那么像.UpdateOrder(...)这样的行为如何封装CRUD,以及与Repository的接口呢?通过域名服务?

好的,那么我的存储库有一个有效的CRUD,它与我的.UpdateOrder(...)一起使用。这很好。但是我不希望有人在存储库上使用更新方法,我希望他们在实体上进行行为(使用UpdateOrder()代替)。我更希望我的领域模型满足不变量的方式--通过它的设计(私有集属性等)--我的存储库不公开“更新”/persisting实体的替代方法。

这仅仅是一个访问修饰符问题,由我在Repo public中没有更新方法来解决。还是有更好的答案?请帮助我DDD忍者。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-03 14:48:48

DDD的严格顺序是:

代码语言:javascript
运行
复制
var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);

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

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

票数 3
EN

Stack Overflow用户

发布于 2010-12-03 14:52:48

如果您的域模型不包括持久性,那么它不包括存储某些内容的操作。如果您的实体是来自域模型的东西,那么它就不需要自己持久化。

你说:

,这很好。但我不希望有人在存储库上使用更新方法,我希望他们在实体上进行行为

但我觉得这是错的。您的域对象对持久化没有更多的责任,就像它们打印自己、在屏幕上绘制自己一样。域类不应该有UpdateOrder方法。

现在,您可能不想将原始存储库(从您的持久性实现层)公开给其他代码,但这只是意味着将它封装在合适的东西中。听起来你确实有一些代码需要讨论持久性,所以找出它需要在哪个层次上进行讨论,并向它公开一个合适的接口。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4336819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档