这里有一个真实的例子,可以引出我的问题:我有一个 AddCommentToArticleCommand,它有一个 ArticleId、评论文本和电子邮件地址。这个命令:
- 使用文章库获取文章(领域实体)
- 如果文章存在,它会调用 article.AddComment(commentText, emailAddress),将评论添加到文章中,如果不能添加则抛出异常(由于电子邮件格式无效、文章已关闭、评论未填写等)长等等...)
- 但现在我不知道保存添加的评论的最佳方法是什么?
我应该做类似 articleRepository.Save(article) 的事情吗?但是,如果只是添加评论,我为什么要保存文章?或者我可以做类似 articleRepository.SaveComment(comment) 的事情,它只会保存评论吗?或者你会在这里采取什么方法?
谢谢!
最佳答案
作为MattDavey指出,在 DDD 中你通常会想到 Aggregate生命周期,与 CRUD 持久性问题无关。 Aggregate 生命周期的中期和末期由相应的 Repository 处理。 .关于您的具体问题:
but now I don't know what the best way is to save the added comment?
处理这个问题的最好方法是找到一个可靠的 ORM 并实现你的
articles.MakePersistent(article)
使用此 ORM 的存储库方法。好的ORM会实现UnitOfWork ,将包括脏跟踪、延迟加载和其他与持久性相关的问题,而不会限制您的域对象。 ORM 知道如何在保存聚合时避免不需要的 SQL INSERT/UPDATE。您的域对象应该尽可能持久无知。例如,NHibernate 对您的对象施加的唯一约束是它们应该具有私有(private)默认构造函数。除此之外,它们可以是不了解所有持久性问题的简单 POCO 对象。需要明确的是,域对象不应具有 IsTransient
或 IsDirty
标志。如果您发现自己正在编写使用这些标志的代码,那么您就是 reinveting the wheel .
关于c# - 保存域实体更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496094/