Я думаю, что для реализации следует оставить в хранилище единицу работы, кэширование или любые другие связанные концепции. Я предпочитаю, чтобы интерфейс напоминал хранилище данных, которое соответствует модели предметной области под рукой. Чтобы репозиторий клиентов выглядел примерно так:
interface ICustomerRepository
{
Customer Load(int id);
IEnumerable<Customer> Search(CustomerQuery q);
void Save(Customer c);
void Delete(Customer c);
}
Это может быть легко реализовано с помощью NHibernate, NHibernate с NHibernate.Linq, прямой библиотеки SQL или даже хранилища XML или простых файлов. Если возможно, мне нравится хранить концепцию транзакции вне репозитория или в более глобальном масштабе, чтобы операции нескольких репозиториев могли быть частью одной транзакции.