2009-11-26 6 views
11

Czy możesz podać przykład, w jaki sposób używałbyś (twoje ulubione) środowisko DI do podłączania modeli widoków MVVM dla aplikacji WPF?Jak mogę połączyć MVVM i Injection Dependency Injection w aplikacji WPF?

Czy stworzysz silnie powiązaną hierarchię modeli widoku (np. Gdzie każdy model ViewModel zagnieżdżonej jest właściwością w modelu ViewModel rodzica i wiążesz go z DataContext kontrolki zagnieżdżonej w XAML) lub użyjesz czegoś jeszcze bardziej -abstract "" Zobacz model "Menedżer", który utrzymuje słabo powiązaną hierarchię ... może jak w CAB?

Odpowiedz

6

Jeśli model widoku może istnieć tylko w połączeniu z innym, tworzę silną relację. To jest model widoku będącego właścicielem, który będzie miał bezpośrednie odniesienie do jednego lub więcej zależnych modeli widoku. Jeśli, z drugiej strony, model widoku powinien istnieć z lub bez innego, biorę luźno powiązane podejście, w którym komunikują się za pośrednictwem szyny zdarzeń.

Jeśli chodzi o używanie DI z MVVM, absolutnie można połączyć dwa. To tak proste, jak:

public class MyViewModel 
{ 
    private readonly IMyDependency _myDependency; 

    public MyViewModel(IMyDependency myDependency) 
    { 
     _myDependency = myDependency; 
    } 
} 

Uwaga jednak, że ten zakłada „Widok Model pierwsze” podejście do MVVM, który ma swoje wady.

+1

Muszę powiedzieć, że nie jestem wielkim fanem "aktywnych" modeli ViewModels ... Trudno wymyślić dla niego jedno-zdańową racjonalną argumentację, ale myślę, że jestem w 'ViewModels powinien być pasywny "obóz ... –

+1

Co masz na myśli przez" aktywny "/" pasywny "model widoku, Mark? –

+1

@Yacoder: Przykładem Kenta Boogaarta jest "aktywny" ViewModel, ponieważ wymaga on zależności i należy założyć, że zamierza używać tej zależności w aktywny sposób. Z drugiej strony, "pasywny" ViewModel to taki, który tworzysz i wypełniasz danymi, a kiedy już to zrobisz, jest on samowystarczalny. –

3

W WPF zwykle jest to dość łatwe i nie zależy tak naprawdę od konkretnego pojemnika DI. Czytałeś już Josh Smith's article on MVVM? Dość dużo opisuje, jak skonfigurować hierarchię ViewModels.

Nie chodzi o to, jak utworzyć te ViewModels z zależności (takich jak repozytoria), ale nie jest to trudna ekstrapolacja.

Często doświadczyłem, że liberalne wykorzystanie abstrakcyjnych fabryk bardzo pomaga w tym zakresie. Zamiast bezpośrednio tworzyć nowe ViewModels, pozwalam wstrzykniętej fabryce zrobić to za mnie.

Możesz użyć DI dla Poor Mana lub dowolnego rodzaju pojemnika DI, aby podłączyć do niego fabrykę.

+0

Z pewnością przeczytałem artykuł, ale nie robi tego ". twięcej szczegółów na temat tworzenia i utrzymywania większego zestawu ViewModels z kilkoma zależnościami w każdym. Obawiam się, że twoja odpowiedź nie jest dla mnie przydatna ( –

+0

@Yacoder: Byłbyś zaskoczony, ilu ludzi używa tutaj terminu MVVM na StackOverflow bez przeczytania tego artykułu –

+0

Thx dla wskaźnika, to doskonały artykuł. – Mathias

1

Opublikowałem this article on Code Project o tym, jak zrobić rozszerzalną aplikację WPF przy użyciu MVVM i MEF dla rozszerzalności. Jednakże, jeśli przyjrzysz się dokładniej, użyłem MEF również dla DI.

Aplikacja jest w pełni typu MVVM i używa tylko DataTemplates (i okazyjnego okna) do wyświetlania, tak jak w artykule Josha Smitha. WPF dba o to, aby zastosować odpowiedni widok w odpowiednim modelu ViewModel. To jest słodkie.

Używa MEF, aby części mogły "znaleźć" się nawzajem. Tak więc ViewModel dla elementu menu "View" znajduje wszystkie pozycje menu, które powinny znajdować się w podmenu za pomocą punktów rozszerzeń, a ViewModels dla każdego z nich "znajdź" ViewModel, który mają przekazać menedżerowi układu za pomocą punkty składu. Ponadto "znajdują" usługę menedżera układu za pomocą podstawowego lokalizatora usług (MEF). Przykład menu Widok jest prawie dokładnie tym, o czym mówisz z zagnieżdżonymi ViewModels. Fajną rzeczą jest to, że nawet nie wiedzą o sobie nawzajem, dopóki nie uruchomią.