例如,如果我有2个聚合根AR1和AR2,AR1以某种方式更新AR2 - 在存储库中存储更改的正确方法是什么? AR1是否应该调用存储库方法?让实体调用存储库方法是否正确?
2
A
回答
2
我不喜欢让存储库提交更改到数据库的想法。
在我的情况下,xRepository.Add(x)仅将实体/ AR附加到当前的工作单元。
要执行db的实际提交,我在我的uow上调用commit。
例如。
C#
using(var uow = UoW.Begin()
{
var ar1Repo = new Ar1Repository(uow);
var ar1 = ar1Repo.FindById(123); //fetch already persistent entity
var ar1.MakeChangesToAr2();
//both ar1 and ar2 are persistent and known by the UoW
//so no need to add them to the repositories since they
//are already _in_ the repositories
uow.Commit();
}
或:
using(var uow = UoW.Begin()
{
var ar1Repo = new Ar1Repository(uow);
var ar2Repo = new Ar2Repository(uow);
var ar2 = new AR2();
var ar1 = new AR1(AR2);
ar1.MakeChangesToAr2();
//attach the new entities to the uow
ar1Repo.Add(ar1);
ar2Repo.Add(ar2);
uow.Commit();
}
这样,您就可以一次提交,而不是试图做的每个实体原子提交你就可能会犯对象问题变化的整个批次,图表。
这个想法是基于Jimmy Nilssons在他的着作“应用领域驱动设计和模式”中的想法。
-1
我想在AR2中有一个名为Save()的方法。该方法将实例化存储库以保存自己。然后,AR1可以调用AR2上的Save()方法。
+0
这真的是要走的路吗?这听起来不像它的域名的一部分。实体不应该知道他们正在被持续? – 2010-11-12 07:22:41
+0
这将使它更像是活动记录比真正的DDD – 2010-11-19 11:41:48
相关问题
- 1. 如何在存储库querybuilder中调用实体的方法
- 2. 静态存储库是使用NHibernate的正确方法吗?
- 3. 保存Hibernate JPA子实体的正确方法是什么
- 4. 从我的存储库中运行2个方法的ActionResult是否正确?
- 5. PySVN - 确定是否存在存储库
- 6. 正确的MVC存储库实例化
- 7. 是否可以确定实例方法是否在原型方法中调用?
- 8. 如何确保使用实体框架存储库调用不被缓存?
- 9. 是否正确引用存储库中的外墙
- 10. 实体框架的通用存储库方法中的错误
- 11. 准备Vuex存储数据的正确方法为AJAX调用
- 12. 通过实体框架无法正确执行存储过程
- 13. 检查URL是否是createObjectURL调用结果的正确方法?
- 14. 什么是使用实体框架的正确方法?
- 15. 哪个是在实体框架中调用存储过程的最佳方法
- 16. 我是否正确使用* ngFor方法?
- 17. 实体对象是否应该由存储库公开?
- 18. 存储参数的正确方法?
- 19. 这是用存储过程执行CRUD的正确方法吗?
- 20. 这是使用mock单元测试存储库的正确方法吗?
- 21. 首先使用实体框架代码实现存储库的通用方法
- 22. 创建通过存储库执行数据库调用的服务的正确方法是什么?
- 23. 在使用实体框架时是否真的需要实现存储库?
- 24. __destruct方法在php中实现Serializable接口时调用是否正确?
- 25. 删除存储库中相关实体的最佳方法
- 26. Spring数据存储库方法实现
- 27. 单元测试,以验证存储库从数据库正确加载实体
- 28. 正确调用方法:(Java)
- 29. 正确的方法调用
- 30. 正确调用“buildRoadOverlay”方法
伟大的观点罗杰,但我不认为这回答的主要问题是是否可以在存储库上有一个实体调用方法。我认为普遍的共识是“不,不允许实体调用存储库方法”,因为它是持久性无知的间接突破,并使测试更加困难。 – jpierson 2011-03-21 13:30:21