Я бы попробовал перейти с шаблоном «Единица работы», где вы открываете, вносите изменения, фиксируете, а затем он просто определяет, что нужно сделать.
Если вы находитесь в реляционной базе данных, вы получите что-то вроде Hibernate с маппером на таблицу. Если вы находитесь в нереляционной базе данных, вам, возможно, придется проявить творческий подход и пометить доменные объекты как IAggregateRoot или что-то еще, чтобы узнать, какие из них имеют свои собственные репозитории, а какие нет.
Например, если сотрудники хранятся в одном SOA, а адреса - в другом, каждый из них будет IAggregateRoots, и в идеале единица работы должна автоматически передавать каждый из грязных экземпляров в соответствующий репозиторий для сохранения.
Таким образом, он прозрачен для клиентского кода, но не является бесполезным слоем косвенности (как это обычно бывает с сервисами в мире java - не всегда, но теми, которые я видел).
Мне нравится DDD, но я думаю, что это завышает репозитории и, эмпирически, вызывает много путаницы, потому что люди всегда спрашивают, как их правильно делать.
Если бы у меня не было системы с несколькими известными бэкэндами на основе SOA (а не просто "эй, мы можем когда-нибудь стать Amazon и нам это нужно"), я бы лично отказался от репозиториев. Конечно, основанные на Hibernate мапперы / DAO / что-то, но они кажутся более простыми и конкретными, чем репозитории.