域驱动设计 - 如何通知UnitOfWork更新的实体?

时间:2010-07-04 15:04:19

标签: domain-driven-design

关于域驱动设计和工作单元模式,我有些不清楚的事情。 假设我有一个从存储库中检索的实体。一旦我更新了这个实体,UnitOfWork应该如何知道它已被更新,那么更新后的实体可以持久保存到数据库中吗? 目前,我看到两个选项:

1)在服务层中手动调用uow.Update(entity)。 E.g:

Employee emp = EmployeeRepository.GetByID(1);
emp.Name = "NewName";
uow.Update(emp);
uow.Commit();

2)依靠一些ORM魔术来跟踪变化,并将更新的实体持久保存到数据库中。 E.g:

Employee emp = EmployeeRepository.GetByID(1);
emp.Name = "NewName";
uow.Commit();

这些选项对我来说都很毛茸茸: 首先 - 如果在某些聚合内部进行了更改,则聚合应该让服务层知道它更新了某些实体。 第二 - 是不是依赖ORM实现违反了持久性无知原则?

你在项目中做了什么?或者我可能会错过某些东西/搞砸了什么并且有更好的解决方案?

由于

1 个答案:

答案 0 :(得分:1)

首先:为什么聚合必须让任何人知道它更新了一些实体?如果您使用的是“每个聚合根存储库”以及一个可以保留整个图形的正确ORM,您可以执行以下操作..

Employee emp = employeeRepository.GetById(1);

emp.RewardWith(new GoldStar());

employeeRepository.Save(emp);

任何一半体面的ORM都将跟踪整个员工图表,以便知道员工星图已被修改并且相应地保持更改。

第二:您的域名需要持久性无知..使用该系统的开发人员不是非常重要:)