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.
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.
Tags und Links wpf silverlight mvvm mvvm-light viewmodellocator