Mejores prácticas de implementación de unidad de trabajo y patrón de repositorio usando ServiceStack.ORMLite

Suponiendo que hay dos interfaces de repositorio:

interface IFooRepository
{
    void Delete(int id);
}

interface IBarRepository
{
    void Delete(int id);
}

Y una interfaz IUnitOfWork como:

interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

¿Cuáles son las mejores prácticas de implementar esas interfaces utilizando ServiceStack.ORMLite para que el usuario pueda usarlas como

MyFooRepository.Delete(4);
// if an Exception throws here, Bar won't be deleted
MyBarRepository.Delete(7);

O

using (var uow = CreateUnitOfWork())
{
    MyFooRepository.Delete(4);
    MyBarRepository.Delete(7);
    uow.Commit();  //now they are in an transaction
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta