2016-07-31 23 views
2

Ich bin neu in Prism und ich bin für einige Hinweise auf die Objekte zur Verfügung während Ansichtsmodell Instanziierung suchen, wenn Prism mit (Prism.Forms 6.2.0 Preview 3) mit Xamarin Forms.Prism Xamarin Forms injizierbare Objekte

ich sehe, daß INavigationService und IEventAggregator Parameterwerte von Rahmen zugeführt werden, wenn sie an das Ziel/Ansichtsmodell zu navigieren. Siehe Code unten für eine Illustration.

public ViewBViewModel(INavigationService navigationService, IEventAggregator ea) 
    { 
     _ea = ea; 
     _navigationService = navigationService; 
    } 

Die Objekte navigationService und ea (oben) wurden von Prism aufgefüllt.

Frage: Was andere Objekte automatisch gefüllt, in einer Viewmodel-Instanz durch den Rahmen (außerhalb von INavigationService und IEventAggregator) sein kann? Vielen Dank.

Antwort

2

Es ist wie diese aussieht sind die Implementierungen für Sie registriert:

  • INavigationService
  • IApplicationProvider
  • IModuleManager
  • IModuleInitializer
  • IEventAggregator
  • IDependencyService
  • IPageDialogService
  • ILoggerFacade

Siehe Quelle here.

Das gesagt, ich kenne nur INavigationService, IEventAggregator und IPageDialogService. ILoggerFacade sieht interessant aus.

Siehe Dokumentation here.

+0

Vielen Dank, dass Sie den Link zum Konstruktorcode und den zusätzlichen injizierten Elementen bereitgestellt haben. Ich kannte auch den INavigationService, IEventAggregator und IPageDialogService. Ich werde einige zusätzliche Forschungen über diese anderen injizierten Objekte machen und den Post mit meinen Antworten aktualisieren, wenn ich gute Informationen finde. Ich würde Ihnen einen Punkt geben, aber mein Niveau ist zu niedrig. Danke noch einmal. –

+0

Ich frage mich, ob jemand jemals einen plattformübergreifenden Logger implementiert hat – Shimmy

0

Sie können alle Dienste/Objekte auflösen, die Sie für den Container registrieren. Registrieren Sie Ihre Objekte mit dem Container innerhalb RegisterTypes() Methode Ihrer App.xaml.cs in Ihrem PrismApplication. Dann lösen Sie es durch Injektion in Ihrem Konstruktor.

// Register 
    Container.RegisterType<IYourObject, YourObject>(); 

// Resolve 
    public SomeClass(IYourObject yourObject) 
    { 
     _yourObject = yourObject; 
    } 

Wenn Sie eine plattformspezifische Abhängigkeiten haben, dann diese Dienste in Ihrer Anwendung initializers, zum Beispiel in iOS registrieren, die AppDelegate.cs die Xamarin.Forms Anwendung wie diese laden,

... 

LoadApplication(new App(new iOSAppInitializer())); 

... 

Die initializer kann

public class iOSAppInitializer : IPlatformInitializer 
{ 
    public void RegisterTypes (IUnityContainer container) 
    { 
     container.RegisterType<IMyService, MyService>(); 
    } 
} 

aussehen wie dies auch, können Sie Plugins von Drittanbietern als RegisterInstance registrieren und sie auch in Ihren Klassen injizieren. Zum Beispiel, sagen Sie Acr.UserDialogs Plugin für Alarm, anstatt die static Instanz überall verwenden (die Unit Testing interessant machen), können Sie einfach registrieren, um sie Ihren Container als

RegisterInstance<IUserDialogs>(UserDialogs.Instance); 

und es injizieren, wo nötig.

public SomeClass(IUserDialogs userDialogs) 
{ 
    _userDialogs = userDialogs; 
} 

PS: Wenn der Drittanbieter-Plugin nicht die Abstraktionen aussetzt, können Sie eine statische wickeln und registrieren verwenden und zu lösen.