2016-10-26 2 views
0

Я пытаюсь сделать приложение cross-plattform, которое будет работать для Xamarin.Forms и WPF (например: https://github.com/C0D3Name/XamFormsWpf) в сочетании с подсветкой MVVM.MVVM Light для Xamarin Forms и WPF

MVVM Light для меня совсем новый, и я не нашел четкого учебника для того, что я хочу сделать. На Xamarin.Forms внедрение зависимости производится

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

Как это делается в MVVM свете? Должен ли я передавать различные реализации plattform ISQLite в качестве параметра?

Я уже создал ViewModelLocator в моем 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); 
} 

Насколько я понял SimpleIoc, я должен зарегистрировать интерфейс к конкретной реализации, но как мой DataService знать о правильном ISQLite реализации ?

Надеюсь, мой вопрос понятен.

ответ

0

Наконец-то я нашел рабочее решение. (Асинхронные) Sqlite-соединение используются в качестве параметра для моего 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; 
     } 
    } 
} 

... и локатор впрыскивает соединение в DataService конструктор:

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

Из официальных документов:

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.

Таким образом, вы хотели бы использовать SimpleIoc создать PCL инъекции зависимостей график (IDataService, например)

И вам придется использовать DependencyService для обеспечения функциональности платформы. Одним из примеров использования DependencyService будет загрузка html-файла, расположенного на устройстве, в webview. Поскольку расположение активов на iOS и Android отличается, вы добавите реализацию конкретной платформы для базового url, а затем используйте DependencyService в своем pcl. Другим примером будет IO.

Так что в вашем случае, если вам нужны конкретные реализации платформы ISQlite, вам придется использовать DependencyService. Если нет, вы можете (или нет) использовать SimpleIoc, чтобы добавить конкретную реализацию интерфейса ISQlite к вашему графику зависимости.

Надеюсь, что это поможет.

Также посмотрите на Akavache. Мы используем его с большим успехом в проектах Xamarin.Forms.