Коротким ответом будет то, что хранилище каким-то образом будет использовать UoW, но я думаю, что взаимосвязь между этими шаблонами менее конкретна, чем это может показаться на первый взгляд. Цель этой единицы работы - создать способ объединить группу функций, связанных с базой данных, чтобы они могли выполняться как элементарный элемент. Часто существует связь между границами, созданными при использовании UoW, и границами, создаваемыми транзакциями, но эта связь является скорее совпадением.
Шаблон Repository, с другой стороны, представляет собой способ создания абстракции, напоминающей коллекцию, через Aggregate Root. Чаще всего вещи, которые вы видите в репозитории, связаны с запросами или поиском экземпляров Aggregate Root. Более интересный вопрос (и тот, который не имеет единственного ответа) заключается в том, имеет ли смысл добавлять методы, которые имеют дело с чем-то другим, кроме запросов к агрегатам. С одной стороны, могут быть некоторые допустимые случаи, когда у вас есть операции, которые будут применяться к нескольким агрегатам. С другой стороны, можно утверждать, что если вы выполняете операции над несколькими агрегатами, вы фактически выполняете одно действие над другим агрегатом. Если вы только запрашиваете данные, я не знаю, действительно ли вам нужно создавать границы, подразумеваемые UoW. Все сводится к домену и как это моделируется.
Два паттерна имеют дело с очень разными уровнями абстракции, и участие Единицы Работ будет зависеть от того, как моделируются Агрегаты. Агрегаты могут хотеть делегировать работу, связанную с сохранением, сущностям, которыми они управляют, или может существовать другой уровень абстракции между Агрегатами и фактическим ORM. Если ваши Агрегаты / Субъекты сами имеют дело с постоянством, то может оказаться целесообразным, чтобы хранилища также управляли этим постоянством. Если нет, то нет смысла включать UoW в ваш репозиторий.
Если вы хотите создать что-то для общего публичного потребления вне вашей организации, то я бы предложил создать ваши интерфейсы репозитория / базовые реализации таким образом, чтобы они могли напрямую взаимодействовать с вашим ORM или нет, в зависимости от потребностей. пользователя вашего ORM. Если это внутреннее, и вы выполняете постоянную работу в ваших Агрегатах. Сущностях, то имеет смысл, чтобы ваш Репозиторий использовал ваше UoW. Для универсального репозитория имеет смысл предоставить доступ к объекту UoW из реализаций репозитория, который может обеспечить его инициализацию и надлежащее удаление. На этой ноте также будут случаи, когда вы, вероятно, захотите использовать несколько репозиториев в пределах одной границы UoW, поэтому вы захотите иметь возможность передавать уже заполненный UoW в репозиторий в этом случае.