【问题标题】:Domain-Driven-Design - How a UnitOfWork should be notified about entities that were updated?Domain-Driven-Design - 如何通知 UnitOfWork 实体已更新?
【发布时间】:2010-07-04 15:04:19
【问题描述】:

我对领域驱动设计和工作单元模式有一些不清楚的地方。 假设我有一个从存储库中检索到的实体。一旦我更新了这个实体,UnitOfWork 应该如何知道它已经更新,所以更新的实体可以持久化到数据库中? 目前,我看到两个选项:

1) 在服务层手动调用uow.Update(entity)。例如:

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

2) 依靠一些 ORM 魔法来跟踪更改,并将更新的实体持久保存到数据库中。例如:

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

这两个选项对我来说似乎很棘手: 首先 - 如果在某个聚合中进行了更改,聚合应该让服务层知道它更新了一些实体。 第二 - 不依赖 ORM 实现是否违反了持久性无知原则?

您在项目中做什么?或者也许我错过了一些东西/搞砸了一些东西并且有更好的解决方案?

谢谢

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    首先:为什么聚合必须让任何人知道它更新了某些实体?如果您使用“每个聚合根的存储库”和适当的 ORM 来保留您的整个图表,您可以执行类似的操作..

    员工emp = employeeRepository.GetById(1); emp.RewardWith(new GoldStar()); employeeRepository.Save(emp);

    任何一半像样的 ORM 都会跟踪整个员工图表,因此它会知道员工星图已被修改并相应地保持更改。

    第二:您的域需要对持久性一无所知.. 使用系统的开发人员不要这样做非常重要:)

    【讨论】:

    • +1 - 持久性无知是关于将持久性问题排除在域对象之外。它要求您依赖知道如何监控聚合更改的外部提供者(如对象/关系映射器)。请参阅The Unit of Work Pattern and Persistence Ignorance,了解 PI 为您带来什么以及为什么让 ORM 处理它是绝对合适的。
    • 感谢 ShanceC 和 Jeff,你们帮了我很多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多