Ранее я работал над системой, которая могла бы выполнить это, и это довольно просто. Поскольку ваш проект находится на ранней стадии, возможно, это может быть полезной для вас информацией. К сожалению, у меня больше нет доступа к коду, но я все еще могу описать, как он работает.
То, что я сделал, построил мои репозитории, используя универсальную реализацию шаблона репозитория. Базовый тип хранилища всегда будет ссылками служб и UoW. Для обсуждения мы будем называть его BaseRepository. Буква «T» будет ограничена реализациями IEntity, которые обозначают Доменный объект. Из BaseRepository я создал другой набор базовых классов для компоновки, таких как SqlBaseRepository, XmlBaseRepository и т. Д.
UoW заботится только о том, чтобы что-то относилось к типу BaseRepository, в котором будут существовать основные функции. Базовый CUD (CRUD) будет представлен, предоставляя эквиваленты для Creates, Updates и Deletes. Каждый из них будет создавать делегата и помещать его в очередь внутри UoW, также передавая информацию о типе транзакции и соответствующие данные, необходимые для его завершения. UoW начал бы вести список того, какие репозитории должны были быть вовлечены в транзакцию, но все равно было все равно, какой это тип. По сути, постановка в очередь здесь подобна зачислению в транзакцию.
BaseRepository определил абстрактный метод, называемый чем-то вроде .ApplyChange (). Как только .Commit () был вызван в UoW, он создал бы TransactionScope () и начал бы вызывать delagates в списке, передавая информацию обратно .ApplyChange (). Фактическая реализация .ApplyChange () существует в конкретной базе репозиториев, то есть в SqlRepositoryBase и т. Д., И также может быть переопределена реализацией.
Там, где это было сложно, по крайней мере, я откатился назад. Я имел дело только с одной базой данных, но иногда были внесены изменения на основе файлов. Я добавил метод .RevertChange () и начал отслеживать исходное состояние и измененные состояния, так что я мог в основном применить обратную дельту, чтобы вернуться туда, где я находился в стеке файлов.
Хотел бы я быть более конкретным в реализации, но прошло уже больше года с тех пор, как я видел код сейчас. Я могу вам сказать, что основа для исходного кода была взята из книги Тима МакКарти " .NET-управляемый домен с C #: проблема - разработка - решение ". Большая часть моей реализации репозитория была основана на его примерах, при этом большинство моих настроек касалось UoW и их реализации.
Надеюсь, это немного поможет! : -)