2016-10-26 3 views
0

Ich versuche eine Cross-Plattform-App zu erstellen, die für Xamarin.Forms und WPF (wie diese: https://github.com/C0D3Name/XamFormsWpf) in Kombination mit MVVM-Licht funktioniert.MVVM Light für Xamarin Forms und WPF

MVVM Light ist ziemlich neu für mich und ich habe kein klares Tutorial für das, was ich machen möchte, gefunden. Auf Xamarin.Forms erfolgt die DependencyInjection von

SQLiteConnection database = DependencyService.Get<ISQLite>().GetConnection("db.sqlite"); 

Wie wird dies in MVVM Licht getan? Muss ich die verschiedenen Plattform-Implementierungen von ISQLite als Parameter übergeben?

Ich habe bereits die ViewModelLocator in meinem PCL:

public class ViewModelLocator 
{ 
    /// <summary> 
    /// Register all the used ViewModels, Services et. al. witht the IoC Container 
    /// </summary> 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<MainViewModel>(); 

     // My DataService is using the connection from ISQlite 
     SimpleIoc.Default.Register<IDataService, DataService>(); 
    } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 
} 

public interface ISQLite 
{ 
    SQLiteConnection GetConnection(string sqliteFilename); 
} 

Soweit ich die SimpleIoc verstanden, ich habe die Schnittstelle zu einer konkreten Implementierung zu registrieren, aber wie meine Data über die richtige ISQLite Implementierung wissen ?

Ich hoffe meine Frage ist verständlich.

Antwort

0

Endlich fand ich eine funktionierende Lösung. Die (async) SQLite-Anschluss wird als Parameter für meine ViewModelLocator

public class App : Application 
{ 
    private static ViewModelLocator locator; 
    public static ViewModelLocator Locator 
    { 
     get 
     { 
      if (locator == null) 
      { 
       var connection = DependencyService.Get<ISQLite>().GetConnection("db.sqlite"); 
       locator = new ViewModelLocator(connection); 
      } 
      return locator; 
     } 
    } 
} 
verwendet

... und der Locator spritzt den Anschluss in den DataService Konstruktor:

public class ViewModelLocator 
{ 
    public ViewModelLocator(SQLiteConnectionWithLock connection) 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
     SimpleIoc.Default.Register<IDataService>(() => new DataService(connection)); 

     // ViewModels 
     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>(); 
} 
1

Von offizieller Dokumentation:

SimpleIoc - A very simple IOC container with basic functionality needed to register and resolve instances.

DependencyService - Xamarin.Forms allows developers to define behavior in platform-specific projects. DependencyService then finds the right platform implementation, allowing shared code to access the native functionality.

So würden Sie SimpleIoc benutzen, um Ihre PCL Dependency Injection Graph (IDataService zum Beispiel) erstellen

Und Sie müssen DependencyService verwenden, um plattformspezifische Funktionen bereitzustellen. Ein Beispiel für die Verwendung von DependencyService wäre das Laden einer HTML-Datei auf dem Gerät in webview. Da die Speicherorte von Assets auf iOS und Android unterschiedlich sind, müssen Sie eine plattformspezifische Implementierung für die Basis-URL hinzufügen und dann DependencyService in Ihrem PCL verwenden. Ein anderes Beispiel wäre IO.

In Ihrem Fall, wenn Sie plattformspezifische Implementierungen von ISQlite benötigen, müssen Sie DependencyService verwenden. Wenn nicht, möchten Sie vielleicht (oder auch nicht) SimpleIoc verwenden, um Ihrem Abhängigkeitsdiagramm eine konkrete Implementierung der ISQlite-Schnittstelle hinzuzufügen.

Hoffe, dass hilft.

Schauen Sie sich auch Akavache. Wir verwenden es mit großem Erfolg in Xamarin.Forms-Projekten.

Verwandte Themen