Não vejo nenhum motivo para o padrão Repositório não funcionar com o Entity Framework. O padrão de repositório é uma camada de abstração que você coloca na sua camada de acesso a dados. Sua camada de acesso a dados pode ser qualquer coisa, desde procedimentos armazenados puros do ADO.NET até o Entity Framework ou um arquivo XML.
Em sistemas grandes, onde você tem dados provenientes de diferentes fontes (banco de dados / XML / serviço da web), é bom ter uma camada de abstração. O padrão Repositório funciona bem nesse cenário. Eu não acredito que o Entity Framework é suficiente abstração para esconder o que acontece nos bastidores.
Eu usei o padrão Repositório com o Entity Framework como meu método de camada de acesso a dados e ainda estou para enfrentar um problema.
Outra vantagem de abstrair o DbContext
com um Repositório é testabilidade de unidade . Você pode ter sua interface IRepository
para a qual tem 2 implementações, uma (o Repositório real) que usa DbContext
para conversar com o banco de dados e a segunda, FakeRepository
que pode retornar objetos na memória / dados escamoteados. Isso torna sua IRepository
unit-testable, assim, outras partes do código que usa IRepository
.
public interface IRepository
{
IEnumerable<CustomerDto> GetCustomers();
}
public EFRepository : IRepository
{
private YourDbContext db;
private EFRepository()
{
db = new YourDbContext();
}
public IEnumerable<CustomerDto> GetCustomers()
{
return db.Customers.Select(f=>new CustomerDto { Id=f.Id, Name =f.Name}).ToList();
}
}
public MockRepository : IRepository
{
public IEnumerable<CustomerDto> GetCustomers()
{
// to do : return a mock list of Customers
// Or you may even use a mocking framework like Moq
}
}
Agora usando o DI, você obtém a implementação
public class SomeService
{
IRepository repo;
public SomeService(IRepository repo)
{
this.repo = repo;
}
public void SomeMethod()
{
//use this.repo as needed
}
}