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