保存域实体更改

L-F*_*our 11 c# entity domain-driven-design repository cqrs

这是一个真实的例子,它将引出我的问题:我有一个AddCommentToArticleCommand,它有一个ArticleId,评论文本和电子邮件地址.这个命令:

  • 使用文章存储库来获取文章(这是域实体)
  • 如果文章存在,则调用article.AddComment(commentText,emailAddress),它将注释添加到文章中并在不能时抛出异常(由于电子邮件格式无效,文章已关闭,评论未填写或太长等. ..)
  • 但现在我不知道保存添加的评论的最佳方法是什么?

我应该像articleRepository.Save(文章)那样做吗?但是,如果只添加评论,为什么要保存文章呢?或者我可以做一些像articleRepository.SaveComment(评论),只会保存评论?或者你会采取什么方法?

谢谢!

Dmi*_*try 8

正如MattDavey指出的那样,在DDD中,您通常会考虑聚合生命周期,而不是CRUD持久性问题.Aggregate的生命中期和结束由相应的Repository处理.关于你的具体问题:

但现在我不知道保存添加的评论的最佳方法是什么?

处理这个问题的最好方法是找到一个可靠的ORM并实现你的

articles.MakePersistent(article)
Run Code Online (Sandbox Code Playgroud)

使用此ORM的存储库方法.好的ORM将实现UnitOfWork,将包括脏跟踪,延迟加载和其他持久性相关问题,而不会限制域对象.ORM知道如何在保存聚合时避免不需要的SQL INSERT/UPDATE.您的域对象应尽可能持久无知.例如,NHibernate对您的对象施加的唯一约束是它们应该具有私有默认构造函数.除此之外,他们可以是简单的POCO对象,不知道所有持久性问题.只是为了清除,域对象不应该有IsTransientIsDirty标志.如果你发现自己编写了使用这些标志的代码,那么你正在重新启动方向盘.

  • 你帮我评论了你的评论,因为我意识到我正在做已经存在的事情.所以我改变了方法:我首先使用实体​​框架和代码; 并实施工作单元模式.所以现在EF上下文正在为我保留更改.感谢您的反馈! (2认同)