2012-10-26 12 views
6

W projekcie MVVM, suppsoe, jeśli View tworzy ViewModel, w jaki sposób ViewModel powinien wiedzieć o swoim modelu?Jak Model powinien przejść do ViewModel?

Przeczytałem z kilku miejsc, że Model można przekazać do ViewModel za pośrednictwem jego konstruktora. Tak to wygląda mniej więcej tak:

class ViewModel { 
    private Model _model; 
    public ViewModel(Model model) { 
     _model = model; 
    } 
} 

ponieważ widok jest tworzenie ViewModel, i przekazać do konstruktora Model ViewModel, wtedy View ma wiedzieć o modelu. Ale z diagramów UML, które widzę z większości projektów MVVM, Widok nie wydaje się nic wiedzieć o Modelu.

Jak model powinien przejść do ViewModel?

Odpowiedz

2

Jesteś prawie na dobrej drodze, po prostu brakuje kluczowej informacji.

Tak, model można przekazać do konstruktora widoku - jest to nazywane wstrzykiwaniem zależności, lub alternatywnie jako Inversion of Control (IoC).

Absolutnie najłatwiejszym sposobem osiągnięcia tego jest użycie UnityContainer z Prism. Gdzieś wokół uruchamiania twojej aplikacji rejestrujesz interfejsy i ich odpowiedni typ implementacji z kontenerem jedności, od tego czasu wywołujesz Resolve<MyInterface>() na kontenerze Unity, aby uzyskać fizyczną instancję typu powiązanego z tą instancją.

Tam, gdzie Unity naprawdę ci pomoże, automatycznie rozwiąże tyle parametrów konstruktora, ile tylko się da, kiedy powiesz mu, aby rozwiązać typ. Więc jeśli konstruktor na viewmodel wygląda następująco:

public class MyViewModel : IMyViewModel 
{ 
    public MyViewModel(IUnityContainer container, IMyModel model) 
    { 
     _container = container; 
     _model = model; 
     ...etc... 
    } 
} 

a widok robi to:

this.DataContext = container.Resolve<IMyViewModel>(); 

pojemnik jedność będzie wtedy nowy się instancją klasy MyViewModel, jak to robi, że to również rozwiązuje i tworzy instancję klasy związanej z IMyModel.

+0

Dzięki! Nie używam Prism i UnityContainer. Z tego, o czym wspomniałeś, wydaje się, że chodzi o użycie interfejsu dla Modelu w konstruktorze ViewModel. Ale w takim przypadku, w jaki sposób ViewModel wiedziałby o metodach i danych w Modelu? Czy interfejs Modelu byłby generyczny jak "IModel", który wszystkie Modele implementują, czy też będzie osobny interfejs dla każdego modelu, jak dla 'MyFirstModel', jest' IMyFirstModel', dla 'MySecondModel' istnieje' IMyFSecondModel 'i tak dalej? – Carven

Powiązane problemy