He investigado esto bastante y no he encontrado una solución "perfecta". El patrón de repositorio funciona maravillosamente para aplicaciones MVC donde el contexto es de corta duración porque existe en un controlador de corta duración, pero el problema ocurre cuando intenta aplicar esa misma estructura a una aplicación wpf donde la VM puede persistir por largos períodos de tiempo.
He usado esta solución en el pasado, que es mucho más simple que muchos de los patrones de repositorio que he visto que intentan abstraer las cosas a una cantidad extrema, lo que resulta en cantidades de código casi ilegibles que son difíciles de depurar. Aquí están los pasos ...
- Cree un proyecto separado para que EDMX actúe como su capa de acceso a datos
- Crear una carpeta "Repositorios" en el mismo proyecto
Cree una clase base "BaseRepository" para actuar como la "Unidad de trabajo". IDisposable
le permitirá utilizar esto en una using(){}
y partial
le permitirá hacer aplicar otros repositorios
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Cree otro archivo llamado "MyOtherRepository". crea la misma clase parcial pero implementa métodos basados en lo que quieres que contenga ese archivo
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Ahora en tu VM puedes hacer esto ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Esto agrupa todos sus repositorios en una clase para que no tenga que lidiar con un contexto separado. Le permite administrar mejor los diferentes repositorios al agrupar los métodos en diferentes archivos y ayuda a evitar la duplicación de código. Además de eso, sus contextos son tan efímeros como lo fueron sin usar este patrón.
La desventaja es que con sistemas más grandes, puede tener muchos métodos que se agrupan bajo su repositorio. Una solución en ese caso sería implementar algunos comandos comunes básicos como "Buscar" o "Agregar" e implementar otros especializados en sus respectivos repositorios.