Глоссарий
Unit of Work
Объект, отслеживающий изменения в aggregate за одну бизнес-операцию и координирующий их запись в одной транзакции.
Unit of Work — паттерн из PoEAA (Fowler, 2002).
Задачи:
- Отследить, какие объекты изменились.
- Скоординировать запись в одной транзакции.
- Обеспечить консистентность.
Практика в Python: SQLAlchemy AsyncSession = Unit of Work. Дополнительный слой UoW редко нужен.
Ключевое правило: UoW живёт в use case, не в repository. Так одна бизнес-операция может изменить несколько aggregate в одной транзакции.
async def execute(self, cmd):
async with self._uow:
order = Order.place(cmd)
await self._orders.save(order)
await self._inventory.reserve(order)
# commit по выходу из async with
Плохо: session.begin() внутри OrderRepository.save(). Тогда orders.save + inventory.reserve не могут быть в одной транзакции.