Spojrzałem na to całkiem sporo i nie znalazłem „idealnego” rozwiązania. Wzorzec repozytorium działa doskonale w aplikacjach MVC, w których kontekst jest krótkotrwały, ponieważ istnieje on w krótkotrwałym kontrolerze, ale problem występuje, gdy próbujesz zastosować tę samą strukturę do aplikacji wpf, w której maszyna wirtualna może utrzymywać się przez długi czas.
W przeszłości korzystałem z tego rozwiązania, które jest o wiele prostsze niż wiele wzorców repo, które widziałem podczas tej próby wyodrębnienia rzeczy do ekstremalnych rozmiarów, co skutkuje prawie nieczytelnymi ilościami kodu, które są trudne do debugowania. Oto kroki ...
- Utwórz osobny projekt dla EDMX, który będzie działał jako twoja warstwa dostępu do danych
- Utwórz folder „Repozytoria” w ramach tego samego projektu
Utwórz klasę podstawową „BaseRepository”, aby działała jako „Jednostka pracy”. IDisposable
pozwoli ci to wykorzystać w a using(){}
oraz partial
pozwoli ci na implementację innych repozytoriów
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Utwórz kolejny plik o nazwie „MyOtherRepository”. utwórz tę samą klasę częściową, ale zaimplementuj metody oparte na zawartości pliku
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Teraz na swojej maszynie wirtualnej możesz to zrobić ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
To grupuje wszystkie twoje repozytoria w jednej klasie, więc nie musisz zajmować się osobnym kontekstem. Pozwala lepiej zarządzać różnymi repozytoriami poprzez grupowanie metod w różnych plikach i pomaga zapobiegać powielaniu kodu. Co więcej, twoje konteksty są tak krótkie, jak były bez użycia tego wzorca.
Wadą jest to, że w przypadku większych systemów możesz mieć wiele metod, które są dołączane do repozytorium. Jednym z rozwiązań w tym przypadku byłoby zaimplementowanie podstawowych podstawowych poleceń, takich jak „Znajdź” lub „Dodaj”, oraz zaimplementowanie specjalistycznych poleceń w odpowiednich repozytoriach.