Você está realmente certo. DbContext
é uma implementação do padrão de unidade de trabalho e IDbSet
é uma implementação do padrão de repositório.
Atualmente, os repositórios são muito populares e usados em excesso. Todos os usam apenas porque existem dezenas de artigos sobre a criação de repositório para a estrutura da entidade, mas ninguém descreve os desafios relacionados a essa decisão.
Os principais motivos para usar o repositório são geralmente:
- Ocultar EF da camada superior
- Tornar o código melhor testável
A primeira razão é algum tipo de pureza arquitetônica e uma ótima idéia de que, se você tornar suas camadas superiores independentes do EF, poderá posteriormente mudar para outra estrutura de persistência. Quantas vezes você viu isso no mundo real? Esse motivo torna o trabalho com o EF muito mais difícil, porque seu repositório deve expor muitos recursos adicionais, abrangendo o que o EF permite por padrão.
Ao mesmo tempo, o acondicionamento do código EF pode manter seu código melhor organizado e seguindo a regra de separação de preocupações. Para mim, essa pode ser a única vantagem real do repositório e da unidade de trabalho, mas você precisa entender que seguir esta regra com a EF talvez torne seu código mais fácil de manter e de melhor legibilidade, mas no esforço inicial para criar seu aplicativo será muito maior e para aplicativos menores, isso pode ser uma complexidade desnecessária.
O segundo motivo está parcialmente correto. A grande desvantagem do EF é a arquitetura rígida, que dificilmente pode ser ridicularizada; portanto, se você deseja testar a camada superior da unidade, é necessário agrupar o EF de alguma forma para permitir que sua implementação seja ridicularizada. Mas isso tem muitas outras consequências que descrevi aqui .
Eu sigo o blog de Ayende . Se você já usou o NHibernate, provavelmente conhece os artigos dele. Esse cara recentemente escreveu vários artigos contra o uso de repositório com o NHibernate, mas o NHibernate é muito melhor ridicularizável.