c# - 保存域实体更改

标签 c# domain-driven-design repository entity cqrs

这里有一个真实的例子,可以引出我的问题:我有一个 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 对象。需要明确的是,域对象不应具有 IsTransientIsDirty 标志。如果您发现自己正在编写使用这些标志的代码,那么您就是 reinveting the wheel .

关于c# - 保存域实体更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496094/

相关文章:

c# - 工厂模式应该放在 DDD 中的什么位置?

jpa - 如何在 DDD 中实现 Vaughn Vernon 关于聚合中引用的建议

oop - 如何对区域和该区域中的点进行建模?

Mercurial 传出 Hook

ant - 无法让 Apache Ivy 不从 Spring 存储库下载源代码

linq - 可以让存储库与服务层返回 View 或 View 模型吗?哪些应该被缓存?

c# - 如何告诉 Blazor Webassembly 网站的访问者他们的浏览器不支持 Webassembly?

c# - ASP.NET:是否可以将 Request.Form 传递给函数?

c# - 未捕获异常

c# - 如何在 .NET Webforms 中使用 Jquery AJAX 将数据发布到 MySQL