2012-12-13 20 views
6

Mam aplikacji WPF, który wygląda mniej więcej tak:WPF, MVVM, ICommand i repozytoria

enter image description here

ViewModel otacza model i odsłania wszelkie atrybuty odnoszące się do widoku poprzez INotifyChanged. Widok jest również powiązany z kilkoma obiektami ICommand, które obsługują określone zachowanie wywołane przez widok. Mam zewnętrzną funkcję ICommand, której jedynym celem jest zapisanie modelu w bazie danych.

Wszystko, co przeczytałem, wskazuje, że ani widok, ani viewmodel nie powinien mieć odniesienia do repozytorium. To jest powód, dla którego Command 3 znajduje się poza viewmodel.

Moje pytanie jest dwojakie. Po pierwsze, czy jest to rozsądna architektura, a po drugie, jaki jest dobry sposób na przeniesienie instancji modelu do komendy 3, aby można ją było umieścić w repozytorium?

+0

Jak dokładnie "Komendy 1" i "Komendy 2" w maszynie wirtualnej i "Komenda 3" znajdują się poza maszyną wirtualną? Czy wszystkie polecenia nie są implementowane osobno w swoich własnych klasach i tylko "dodawane" do maszyny wirtualnej jako jej właściwości? W tym kontekście, jak jest jedno polecenie w maszynie wirtualnej i inne wyjście z maszyny wirtualnej? –

Odpowiedz

8

Ja osobiście nie widzę problemu z tym, że ViewModel ma odniesienie do repozytorium. Próba uniknięcia tego spowoduje niepotrzebne komplikacje.

W MVVM ViewModel jest zwykle warstwą "kleju", która znajduje się nad modelem, a repozytorium jest częścią modelu (jest to część danych/logiki właściwej dla danej domeny). My blog series on MVVM shows a good image, jak ja osobiście myślę o tym:

MVVM Diagram

Wakacyjne prace VM z repozytorium bezpośrednio poprzez umieszczenie Rozkaz 3 do VM prawdopodobnie być czystsze niż próba oddzielenia go.

+0

Chciałbym tylko dodać trochę do tego, co powiedział Reed: Można na pewno oddzielić go nieco, odejmując szczegóły swojego repozytorium, jeśli chcesz. Ale zgadzam się, nie ma powodu, aby całkowicie oddzielić je tak, jak pokazuje diagram. – Tim

+0

@Tim Good point. Odblokowywanie szczegółów repozytorium jest bardzo przydatne, ale prawie osobny problem (świetny do testowalności itp.). –

+0

Zgadzam się, że jest to odrębna kwestia, ale zastanawiam się, czy ten rodzaj abstrakcji mógł być powodem przesłuchania PO, że powinien je rozdzielić. Chciałem tylko odpowiedzieć na "dobrze, więc dlaczego [ktokolwiek] powiedział, że powinienem to zrobić, jeśli nie potrzebuję?" pytanie zanim o to zapytał! – Tim

0

Model widoku powinien komunikować się z warstwą biznesową (obiekty domenowe + usługi domenowe), a nie bezpośrednio z repozytorium. Co więcej, ta komunikacja powinna odbywać się za pomocą poleceń.

Więc trzeba:

Widok -> Widok Model -> Command -> Object Domeny/usługi Domain -> Repository

Chyba że rozwijają się bardzo prostą aplikację CRUD ...

Powiązane problemy