2013-06-13 14 views
5

Używam ramy Prism z EF w aplikacji WPF.Architektura MVVM + Entity Framework zamieszanie

ViewModel:

  • przechowuje referencje serwisowa (minęły pojemnika jedności).

Usługi:

  • są świadczące operacji „wysoki poziom” z danymi
  • utrzymuje odniesienie repozytorium, który zapewnia podstawowe operacje CRUD z tabeli bazy danych (za pomocą pojedynczego repozytorium).

Repozytorium:

  • każda metoda w repozytorium wykorzystuje „używając” wzór, gdzie mogę pracować krótko kontekście obiektu.

To tutaj utknąłem: po usunięciu kontekstu obiektu nie mogę już pracować z mapowanymi właściwościami. Mój model bazy danych jest złożony (wiele powiązanych tabel) i wiele wywołań .Include() podczas pobierania danych sprawia, że ​​kod jest brudny.

Po przeczytaniu kilku wątków odkryłem, że wzór "jednostki pracy" jest prawdopodobnie tym, czego potrzebuję.

Nadchodzi moje pytanie:

Kto utrzymuje odniesienie jednostki pracy (a tym kontekście)? Jeśli wybiorę metodę kontekstu na widok, viewModel powinien mieć odniesienie do kontekstu. W jaki sposób mogę teraz wprowadzić jednostkę pracy do moich usług? Czy powinienem utworzyć nową instancję usługi w ViewModel i przekazać kontekst w parametrze konstruktora?

Odpowiedz

3

Używamy podobną architekturę w projekcie.

  • Każdy ViewModel dostaje swój własny przedmiot usługi, która zostanie wstrzyknięta w konstruktorze (przynajmniej te najlepsze poziomu, które bezpośrednio odpowiadają widokiem Niektóre hierarchiczne ViewModels może ponownie użyć usługi rodzica, ale trzymajmy to tutaj w prosty sposób).

  • Domyślnie każda operacja Serwis tworzy nowy kontekst, ale ...

  • Usługi mają BeginContext i EndContext metod, które mogą być wywoływane przez ViewModels zachować kontekst otworzyć na wiele operacji.

To zadziałało dobrze dla nas. Zazwyczaj wywołujemy BeginContext po otwarciu widoku i EndContext po zamknięciu.

+1

Wreszcie, rozwiązuję to z następującym podejściem: kiedy View jest otwarty, ViewModel tworzy obiekt UnitOfWork, który składa się z kontekstu i kilku usług. Usługi w tej samej jednostce pracy wstrzyknęły ten sam kontekst. Jednostka pracy jest usuwana, gdy widok jest zamknięty. Projekt w tym wątku [link] (http://teusje.wordpress.com/2011/10/16/unicornmanager-prism-4-mef-wpf-ef-4-1-code-first-nuget-datavalidation/) to także inspirujące. Dziękuję, Daniel. – yurislav