Domain-Driven-Design - Как UnitOfWork следует уведомлять о сущностях, которые были обновлены? - PullRequest
2 голосов
/ 04 июля 2010

Что-то неясное для меня в отношении доменного дизайна и схемы работы. Допустим, у меня есть объект, который был извлечен из хранилища. Как только я обновил эту сущность, как 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 Ответ

1 голос
/ 06 июля 2010

Во-первых: почему агрегат должен сообщить кому-либо, что он обновил некоторые сущности?Если вы используете «Репозиторий на совокупный корень» и правильный ORM, который сохранит весь ваш график, вы можете сделать что-то вроде этого.

Employee emp = employeeRepository.GetById(1);

emp.RewardWith(new GoldStar());

employeeRepository.Save(emp);

Любая половина приличного ORM будет отслеживать весь график сотрудников,он будет знать, что звездная диаграмма сотрудников была изменена, и соответственно сохранит изменения.

Во-вторых: ваш домен должен быть невежественным в отношении настойчивости. Очень важно, чтобы разработчики, работающие с системой, не были:

...