Analisei bastante esse assunto e não encontrei uma solução "perfeita". O padrão de repositório funciona maravilhosamente para aplicativos MVC em que o contexto é de curta duração porque existe em um controlador de curta duração, mas o problema ocorre quando você tenta aplicar a mesma estrutura a um aplicativo wpf em que a VM pode persistir por longos períodos de tempo.
Eu usei essa solução no passado, que é muito mais simples do que muitos dos padrões de repo que vi que tentam abstrair as coisas a uma quantidade extrema, resultando em quantidades quase ilegíveis de código que são difíceis de depurar. Aqui estão os passos ...
- Crie um projeto separado para o EDMX atuar como sua camada de acesso a dados
- Crie uma pasta "Repositórios" no mesmo projeto
Crie uma classe base "BaseRepository" para atuar como a "Unidade de Trabalho". IDisposable
permitirá que você use isso em um using(){}
e partial
permitirá implementar outros repositórios
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Crie outro arquivo chamado "MyOtherRepository". crie a mesma classe parcial, mas implemente métodos com base no que você deseja que esse arquivo contenha
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Agora, na sua VM, você pode fazer isso ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Isso agrupa todos os seus repositórios em uma classe para que você não precise lidar com um contexto separado. Ele permite que você gerencie melhor os diferentes repositórios, agrupando os métodos em arquivos diferentes e ajuda a impedir a duplicação de código. Além disso, seus contextos têm uma vida útil curta, sem usar esse padrão.
A desvantagem é que, em sistemas maiores, você pode ter muitos métodos agrupados no seu repositório. Uma solução nesse caso seria implementar alguns comandos comuns básicos, como "Localizar" ou "Adicionar", e implementar comandos especializados em seus respectivos repositórios.