1

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

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

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

4

2 回答 2

3

DDD 中的严格顺序是:

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

存储库始终负责检测/保留实体内的所有更改。

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

于 2010-12-03T14:48:48.290 回答
2

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

你说:

没关系。但我不希望有人在存储库上使用更新方法,我希望他们通过实体上的行为

但我认为这是错误的。你的域对象没有更多的责任来保存自己,而不是打印自己、在屏幕上绘制自己等等。你的域类不应该有一个 UpdateOrder 方法。

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

于 2010-12-03T14:52:48.547 回答