WARNING: please note that my views have changed, and you should consider the following advise outdated. Please see this answer for an updated view: https://stackoverflow.com/a/30287923/264697
While DI frameworks can manage lifetime of objects for you and some could even dispose objects for you after you're done using with them, it makes object disposal just too implicit. The IDisposable interface is created because there was the need of deterministic clean-up of resources. Therefore, in the context of DI, I personally like to make this clean-up very explicit. When you make it explicit, you've got basically two options: 1. Configure the DI to return transient objects and dispose these objects yourself. 2. Configure a factory and instruct the factory to create new instances.
I favor the second approach over the first, because especially when doing Dependency Injection, your code isn't as clean as it could be. Look for instance at this code:
public sealed class Client : IDisposable
{
    private readonly IDependency dependency;
    public Client(IDependency dependency)
    {
        this. dependency = dependency;
    }
    public void Do()
    {
        this.dependency.DoSomething();
    }
    public Dispose()
    {
        this.dependency.Dispose();
    }
}
While this code explicitly disposes the dependency, it could raise some eyebrows to readers, because resources should normally only be disposed by the owner of the resource. Apparently, the Client became the owner of the resource, when it was injected.
Because of this, I favor the use of a factory. Look for instance at this example:
public sealed class Client
{
    private readonly IDependencyFactory factory;
    public Client(IDependencyFactory factory)
    {
        this.factory = factory;
    }
    public void Do()
    {
        using (var dependency = this.factory.CreateNew())
        {
            dependency.DoSomething();
        }
    }
}
This example has the exact same behavior as the previous example, but see how the Client class doesn't have to implement IDisposable anymore, because it creates and disposes the resource within the Do method.
Injecting a factory is the most explicit way (the path of least surprise) to do this. That's why I prefer this style. Downside of this is that you often need to define more classes (for your factories), but I personally don't mind.
RPM1984 asked for a more concrete example.
I would not have the repository implement IDisposable, but have a Unit of Work that implements IDisposable, controls/contains repositories and have a factory that knows how to create new unit of works. With that in mind, the above code would look like this:
public sealed class Client
{
    private readonly INorthwindUnitOfWorkFactory factory;
    public Client(INorthwindUnitOfWorkFactory factory)
    {
        this.factory = factory;
    }
    public void Do()
    {
        using (NorthwindUnitOfWork db = 
            this.factory.CreateNew())
        {
            // 'Customers' is a repository.
            var customer = db.Customers.GetById(1);
            customer.Name = ".NET Junkie";
            db.SubmitChanges();
        }
    }
}
In the design I use, and have described here, I use a concrete NorthwindUnitOfWork class that wraps an IDataMapper that is the gateway to the underlying LINQ provider (such as LINQ to SQL or Entity Framework). In sumary, the design is as follows:
- An INorthwindUnitOfWorkFactoryis injected in a client.
- The particular implementation of that factory creates a concrete NorthwindUnitOfWorkclass and injects a O/RM specificIDataMapperclass into it.
- The NorthwindUnitOfWorkis in fact a type-safe wrapper around theIDataMapperand theNorthwindUnitOfWorkrequests theIDataMapperfor repositories and forwards requests to submit changes and dispose to the mapper.
- The IDataMapperreturnsRepository<T>classes and a repository implementsIQueryable<T>to allow the client to use LINQ over the repository.
- The specific implementation of the IDataMapperholds a reference to the O/RM specific unit of work (for instance EF'sObjectContext). For that reason theIDataMappermust implementIDisposable.
This results in the following design:
public interface INorthwindUnitOfWorkFactory
{
    NorthwindUnitOfWork CreateNew();
}
public interface IDataMapper : IDisposable
{
    Repository<T> GetRepository<T>() where T : class;
    void Save();
}
public abstract class Repository<T> : IQueryable<T>
    where T : class
{
    private readonly IQueryable<T> query;
    protected Repository(IQueryable<T> query)
    {
        this.query = query;
    }
    public abstract void InsertOnSubmit(T entity);
    public abstract void DeleteOnSubmit(T entity);
    // IQueryable<T> members omitted.
}
The NorthwindUnitOfWork is a concrete class that contains properties to specific repositories, such as Customers, Orders, etc:
public sealed class NorthwindUnitOfWork : IDisposable 
{
    private readonly IDataMapper mapper;
    public NorthwindUnitOfWork(IDataMapper mapper)
    {
        this.mapper = mapper;
    }
    // Repository properties here:    
    public Repository<Customer> Customers
    {
        get { return this.mapper.GetRepository<Customer>(); }
    }
    public void Dispose()
    {
        this.mapper.Dispose();
    }
}
What's left is an concrete implementation of the INorthwindUnitOfWorkFactory and a concrete implementation of the IDataMapper. Here's one for Entity Framework:
public class EntityFrameworkNorthwindUnitOfWorkFactory
    : INorthwindUnitOfWorkFactory
{
    public NorthwindUnitOfWork CreateNew()
    {
        var db = new ObjectContext("name=NorthwindEntities");
        db.DefaultContainerName = "NorthwindEntities";
        var mapper = new EntityFrameworkDataMapper(db);
        return new NorthwindUnitOfWork(mapper);
    }
}
And the EntityFrameworkDataMapper:
public sealed class EntityFrameworkDataMapper : IDataMapper
{
    private readonly ObjectContext context;
    public EntityFrameworkDataMapper(ObjectContext context)
    {
        this.context = context;
    }
    public void Save()
    {
        this.context.SaveChanges();
    }
    public void Dispose()
    {
        this.context.Dispose();
    }
    public Repository<T> GetRepository<T>() where T : class
    {
        string setName = this.GetEntitySetName<T>();
        var query = this.context.CreateQuery<T>(setName);
        return new EntityRepository<T>(query, setName);
    }
    private string GetEntitySetName<T>()
    {
        EntityContainer container =
            this.context.MetadataWorkspace.GetEntityContainer(
            this.context.DefaultContainerName, DataSpace.CSpace);
        return (
            from item in container.BaseEntitySets
            where item.ElementType.Name == typeof(T).Name
            select item.Name).First();
    }
    private sealed class EntityRepository<T>
        : Repository<T> where T : class
    {
        private readonly ObjectQuery<T> query;
        private readonly string entitySetName;
        public EntityRepository(ObjectQuery<T> query,
            string entitySetName) : base(query)
        {
            this.query = query;
            this.entitySetName = entitySetName;
        }
        public override void InsertOnSubmit(T entity)
        {
            this.query.Context.AddObject(entitySetName, entity);
        }
        public override void DeleteOnSubmit(T entity)
        {
            this.query.Context.DeleteObject(entity);
        }
    }
}
You can find more information about this model here.
UPDATE December 2012
This an an update written two years after my original answer. The last two years much has changed in the way I try to design the systems I'm working on. Although it has suited me in the past, I don't like to use the factory approach anymore when dealing with the Unit of Work pattern. Instead I simply inject a Unit of Work instance into consumers directly. Whether this design is feasibly for you however, depends a lot on the way your system is designed. If you want to read more about this, please take a look at this newer Stackoverflow answer of mine: One DbContext per web request…why?