MVVMLight ViewModelLocator Registrierung von Dataservice

7

Diese Frage könnte naiv aussehen, aber ich konnte diesen Code in der Datei ViewModelLocator.cs nicht verstehen:

%Vor%

Ich sehe, dass wir einen DataService verwenden, um Daten (zum Beispiel vom WCF-Dienst) zu erhalten und sie dem MainViewModel zuzuweisen. Aber was passiert, wenn ich mehr als ein ViewModel anmelde? so:

%Vor%

und sagen wir, ich habe einen anderen DataService (DataService2 zum Beispiel), aber diesen benutze ich mit dem Page2ViewModel. Wie kann ich das tun?

Auch, wenn jemand mir helfen kann (oder mir sogar einen Link zum Lesen gibt) über den obigen Code. Ich habe keine Ahnung, was es bedeutet.

    
Qirat 29.01.2012, 09:26
quelle

1 Antwort

21

Sie weisen hier% IDataService dem MainViewModel nicht zu. Sie registrieren eine Typzuordnung, sodass Ihr Container weiß, dass er bei jedem DataService erforderlich ein IDataService zurückgeben soll.

Dies steht im Zusammenhang mit der Abhängigkeitsinjektion Ссылка

Der DI-Container verbindet die Abhängigkeiten automatisch. Wenn Sie also einen bestimmten Typ benötigen, können Sie

aufrufen

ServiceLocator.Current.GetInstance<IDataService>()

oder

%Vor%

usw. Wenn Sie es erstellen können (also haben Sie Ihre Typen registriert), wird das vollständige Abhängigkeitsdiagramm für Sie aufgelöst.

Wenn Ihre MainViewModel beispielsweise eine Konstruktorabhängigkeit von IDataService hat und Sie sich nicht im Entwurfsmodus befinden, wird ein DataService in den Konstruktor MainViewModel eingefügt. Haben Sie keine Angst vor dem Schlagwort injected , es ist nur ein Aufruf an den MainViewModel-Konstruktor mit den entsprechenden Parametern:).

Also wird MainViewModel hier nicht mit Page2ViewModel interferieren.

Ich habe ein einfaches Beispiel für Sie erstellt, um zu demonstrieren, was passiert (ich habe Unity verwendet, Ссылка , aber die Syntax ist fast gleich) :

%Vor%

Die Ausgabe ist:

%Vor%

Weil Sie ein MainViewModel benötigen (vielleicht müssen Sie in SimpleIoC MainViewModel auch in Unity registrieren, kann es konkrete Klassen ohne Mapping auflösen), der Container versucht einen zu erstellen, aber es erkennt, dass MainViewModel ein% benötigt co_de%, und es findet den Standard aus dem Mapping, nämlich IService , aber es stellt fest, dass Service1 ein Service1 benötigt, und es findet den Standard, so dass es ein IRepository an den% übergeben kann co_de% -Konstruktor, dann die Repository -Instanz zum Service1 -Konstruktor. Alle Abhängigkeiten aufgelöst.

Der Aufruf Service1 ist ein Beispiel, wie Sie mehr als einen Typ für dieselbe Schnittstelle registrieren können. Dependency Injection ist ein viel größeres Thema, aber Auto-Verdrahtung ist ein wichtiger Teil davon.

    
Peter Porfy 29.01.2012, 10:12
quelle