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

Domain driven design 通过域封装的持久性,还是通过存储库封装的持久性?,domain-driven-design,entity,separation-of-concerns,ddd-repositories,domainservices,Domain Driven Design,Entity,Separation Of Concerns,Ddd Repositories,Domainservices,如果我的域模型不应该知道/关心存储库,那么封装CRUD更新的.UpdateOrder(…)等行为如何与存储库交互?通过域服务 好的,那么我的存储库有一个有效的CRUD更新,它与我的.UpdateOrder(…)一起使用。那很好。但是我不希望有人在存储库上使用Update方法,我希望他们在实体上进行操作(改为使用UpdateOrder()。我希望,与我的域模型满足不变量的方式类似——通过它的设计(私有集属性等)——我的存储库不公开另一种方法来“更新/持久化实体” 这仅仅是一个访问修饰符问题,我没有

如果我的域模型不应该知道/关心存储库,那么封装CRUD更新的
.UpdateOrder(…)
等行为如何与存储库交互?通过域服务

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


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

DDD中的严格顺序是:

var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);
var entityRepository=MyServiceLocator.Get();
var myEntity=entityRepository.Load();
改变(某物);
实体保存(我的实体);
存储库始终负责检测/持久化实体内的所有更改


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

DDD中的严格顺序是:

var entityRepository = MyServiceLocator.Get<IEntityRepository>();
var myEntity = entityRepository.Load(<some criteria>);
myEntity.Change(something);
entityRepository.Save(myEntity);
var entityRepository=MyServiceLocator.Get();
var myEntity=entityRepository.Load();
改变(某物);
实体保存(我的实体);
存储库始终负责检测/持久化实体内的所有更改


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

如果您的域模型不包括持久性,那么它就不包括存储某些内容的操作。如果您的实体是域模型中的某个对象,那么它就没有业务持久化自己

你说:

那很好。但我不想要任何人 要在上使用Update方法,请执行以下操作: 仓库,我想让他们检查一下 实体上的行为

但我认为这是错误的。您的域对象对持久化自己的责任不比打印自己、在屏幕上绘制自己等多。您的域类不应该有UpdateOrder方法


现在,您可能不想将原始存储库(从您的持久性实现层)公开给其他代码,但这只意味着将其包装成合适的东西。听起来您确实有需要讨论持久性的代码,所以请确定它需要在什么级别上工作,并向其公开合适的接口。

如果您的域模型不包括持久性,那么它就不包括存储某些内容的操作。如果您的实体是域模型中的某个对象,那么它就没有业务持久化自己

你说:

那很好。但我不想要任何人 要在上使用Update方法,请执行以下操作: 仓库,我想让他们检查一下 实体上的行为

但我认为这是错误的。您的域对象对持久化自己的责任不比打印自己、在屏幕上绘制自己等多。您的域类不应该有UpdateOrder方法


现在,您可能不想将原始存储库(从您的持久性实现层)公开给其他代码,但这只意味着将其包装成合适的东西。听起来您确实有需要讨论持久性的代码,所以请确定它需要在什么级别上工作,并向它公开一个合适的接口。

UpdateOrder做什么,需要什么类型的参数?它实际上是在用实体中的值更新持久存储吗?UpdateOrder是业务模型的一种行为。它采取什么或做什么其实并不重要,只是它封装了域逻辑,最后它需要保持更改的状态?它实际上是在用实体中的值更新持久存储吗?UpdateOrder是业务模型的一种行为。它采取什么或做什么并不重要,只是它封装了域逻辑,最后需要保持更改的状态。谢谢。良好的反馈,是的,实体是示例中的根。所以我要理解,
myEntity.Change(某物)在您的示例中,即使通过域服务,也不应挂回存储库以保持更改的状态?正确-更改应传播到最终entityRepository.Save()中的perssitence存储中。如果你在你的存储库中使用一个像样的ORM,脏的跟踪/持久化应该会自动为你处理。我将此标记为答案,因为它对实现解决方案最有帮助-不一定是因为它直接回答了我复杂的问题。谢谢。良好的反馈,是的,实体是示例中的根。所以我要理解,
myEntity.Change(某物)在您的示例中,即使通过域服务,也不应挂回存储库以保持更改的状态?正确-更改应传播到最终entityRepository.Save()中的perssitence存储中。如果你在你的存储库中使用一个像样的ORM,那么脏的跟踪/持久化应该会自动为你处理。我将此标记为答案,因为它对实现解决方案最有帮助,而不一定是因为它直接回答了我复杂的问题。