Ich habe mir das ziemlich genau angesehen und keine "perfekte" Lösung gefunden. Das Repository-Muster funktioniert wunderbar für MVC-Anwendungen, bei denen der Kontext nur von kurzer Dauer ist, da er in einem kurzlebigen Controller vorhanden ist. Das Problem tritt jedoch auf, wenn Sie versuchen, dieselbe Struktur auf eine wpf-App anzuwenden, bei der die VM über einen längeren Zeitraum bestehen bleiben kann.
Ich habe diese Lösung in der Vergangenheit verwendet, die viel einfacher ist als viele der Repo-Muster, die ich gesehen habe und die versuchen, Dinge extrem zu abstrahieren, was zu nahezu unlesbaren Mengen an Code führt, die schwer zu debuggen sind. Hier sind die Schritte ...
- Erstellen Sie ein separates Projekt, damit EDMX als Datenzugriffsschicht fungiert
- Erstellen Sie unter demselben Projekt einen Ordner "Repositorys"
Erstellen Sie eine Basisklasse "BaseRepository" als "Arbeitseinheit". IDisposable
ermöglicht es Ihnen, dies in a zu verwenden, using(){}
und partial
ermöglicht es Ihnen, andere Repositorys zu implementieren
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Erstellen Sie eine weitere Datei mit dem Namen "MyOtherRepository". Erstellen Sie dieselbe Teilklasse, implementieren Sie jedoch Methoden basierend auf dem, was diese Datei enthalten soll
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Jetzt können Sie dies in Ihrer VM tun ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Dadurch werden alle Ihre Repositorys unter einer Klasse zusammengefasst, sodass Sie sich nicht mit einem separaten Kontext befassen müssen. Sie können verschiedene Repos besser verwalten, indem Sie die Methoden in verschiedene Dateien gruppieren, und so verhindern, dass Code dupliziert wird. Darüber hinaus sind Ihre Kontexte so kurzlebig wie ohne dieses Muster.
Der Nachteil ist, dass Sie bei größeren Systemen möglicherweise viele Methoden haben, die unter Ihrem Repo gebündelt werden. Eine Lösung in diesem Fall wäre, einige grundlegende allgemeine Befehle wie "Suchen" oder "Hinzufügen" zu implementieren und spezielle Befehle in ihrem jeweiligen Repository zu implementieren.